/
ChannelUtil.java
136 lines (117 loc) · 6.17 KB
/
ChannelUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.dv8tion.jda.internal.utils;
import net.dv8tion.jda.api.entities.channel.Channel;
import net.dv8tion.jda.api.entities.channel.ChannelType;
import net.dv8tion.jda.api.entities.channel.attribute.ICategorizableChannel;
import net.dv8tion.jda.api.entities.channel.attribute.IPositionableChannel;
import net.dv8tion.jda.api.entities.channel.concrete.Category;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import java.util.EnumSet;
public class ChannelUtil
{
public static final EnumSet<ChannelType> SLOWMODE_SUPPORTED = EnumSet.of(
ChannelType.TEXT, ChannelType.FORUM, ChannelType.MEDIA,
ChannelType.GUILD_PUBLIC_THREAD, ChannelType.GUILD_NEWS_THREAD, ChannelType.GUILD_PRIVATE_THREAD,
ChannelType.STAGE, ChannelType.VOICE
);
public static final EnumSet<ChannelType> NSFW_SUPPORTED = EnumSet.of(ChannelType.TEXT, ChannelType.VOICE, ChannelType.FORUM, ChannelType.MEDIA, ChannelType.NEWS, ChannelType.STAGE);
public static final EnumSet<ChannelType> TOPIC_SUPPORTED = EnumSet.of(ChannelType.TEXT, ChannelType.FORUM, ChannelType.MEDIA, ChannelType.NEWS);
public static final EnumSet<ChannelType> POST_CONTAINERS = EnumSet.of(ChannelType.FORUM, ChannelType.MEDIA);
public static final EnumSet<ChannelType> THREAD_CONTAINERS = EnumSet.of(ChannelType.TEXT, ChannelType.NEWS, ChannelType.FORUM, ChannelType.MEDIA);
public static <T extends Channel> T safeChannelCast(Object instance, Class<T> toObjectClass)
{
if (toObjectClass.isInstance(instance))
return toObjectClass.cast(instance);
String cleanedClassName = instance.getClass().getSimpleName().replace("Impl", "");
throw new IllegalStateException(Helpers.format("Cannot convert channel of type %s to %s!", cleanedClassName, toObjectClass.getSimpleName()));
}
public static int compare(GuildChannel a, GuildChannel b)
{
Checks.notNull(b, "Channel");
// Check thread positions
ThreadChannel thisThread = a instanceof ThreadChannel ? (ThreadChannel) a : null;
ThreadChannel otherThread = b instanceof ThreadChannel ? (ThreadChannel) b : null;
if (thisThread != null && otherThread == null)
{
// Thread should be below its parent
if (thisThread.getParentChannel().getIdLong() == b.getIdLong())
return 1;
// Otherwise compare parents
return thisThread.getParentChannel().compareTo(b);
}
if (thisThread == null && otherThread != null)
{
// Thread should be below its parent
if (otherThread.getParentChannel().getIdLong() == a.getIdLong())
return -1;
// Otherwise compare parents
return a.compareTo(otherThread.getParentChannel());
}
if (thisThread != null)
{
// If they are threads on the same channel
if (thisThread.getParentChannel().getIdLong() == otherThread.getParentChannel().getIdLong())
return Long.compare(b.getIdLong(), a.getIdLong()); // threads are ordered ascending by age
// If they are threads on different channels
return thisThread.getParentChannel().compareTo(otherThread.getParentChannel());
}
// Check category positions
Category thisParent = a instanceof ICategorizableChannel ? ((ICategorizableChannel) a).getParentCategory() : null;
Category otherParent = b instanceof ICategorizableChannel ? ((ICategorizableChannel) b).getParentCategory() : null;
if (thisParent != null && otherParent == null)
{
if (b instanceof Category)
{
// The other channel is the parent category of this channel
if (b.getIdLong() == thisParent.getIdLong())
return 1;
// The other channel is another category
return thisParent.compareTo(b);
}
return 1;
}
if (thisParent == null && otherParent != null)
{
if (a instanceof Category)
{
// This channel is parent of other channel
if (a.getIdLong() == otherParent.getIdLong())
return -1;
// This channel is a category higher than the other channel's parent category
return a.compareTo(otherParent); //safe use of recursion since no circular parents exist
}
return -1;
}
// Both channels are in different categories, compare the categories instead
if (thisParent != null && !thisParent.equals(otherParent))
return thisParent.compareTo(otherParent);
// Check sort bucket (text/message is above audio)
if (a.getType().getSortBucket() != b.getType().getSortBucket())
return Integer.compare(a.getType().getSortBucket(), b.getType().getSortBucket());
// Check actual position
if (b instanceof IPositionableChannel && a instanceof IPositionableChannel)
{
IPositionableChannel oPositionableChannel = (IPositionableChannel) b;
IPositionableChannel thisPositionableChannel = (IPositionableChannel) a;
if (thisPositionableChannel.getPositionRaw() != oPositionableChannel.getPositionRaw())
return Integer.compare(thisPositionableChannel.getPositionRaw(), oPositionableChannel.getPositionRaw());
}
// last resort by id
return Long.compareUnsigned(a.getIdLong(), b.getIdLong());
}
}