forked from mamoe/mirai
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGroup.kt
330 lines (290 loc) · 10 KB
/
Group.kt
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
/*
* Copyright 2019-2023 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
@file:Suppress("EXPERIMENTAL_API_USAGE", "unused", "UnusedImport", "NOTHING_TO_INLINE")
@file:JvmBlockingBridge
package net.mamoe.mirai.contact
import kotlinx.coroutines.CoroutineScope
import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.active.GroupActive
import net.mamoe.mirai.contact.announcement.Announcements
import net.mamoe.mirai.contact.essence.Essences
import net.mamoe.mirai.contact.file.RemoteFiles
import net.mamoe.mirai.contact.roaming.RoamingSupported
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.DeprecatedSinceMirai
import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.NotStableForInheritance
import kotlin.jvm.JvmStatic
import kotlin.jvm.JvmSynthetic
/**
* 群.
*
* ## 群员操作
*
* ### 获取群成员
*
* 使用 [Group.members] 可获取除 [Bot] 自身外的所有群成员 (包括管理员和群主) 列表. [Bot] 自身在群内的对象可通过 [botAsMember] 获取.
*
* [get] 可以按 QQ 号码获取一个群成员对象, 在不存在时返回 `null`. [getOrFail] 则在不存在时抛出 [NoSuchElementException].
*
* ### 判断管理员权限
*
* 首先获取到目标群成员对象, 然后使用 [NormalMember.permission] 获取其权限.
*
* [Bot] 在群内的权限可通过 [Group.botPermission] 或其 [Member 对象][botAsMember] 的 [NormalMember.permission] 获取.
*
* ### 其他动作
*
* - 设置管理员权限: [NormalMember.modifyAdmin]
* - 禁言: [NormalMember.mute]
* - 戳一戳: [NormalMember.nudge]
*
* ## 群公告
*
* 可通过 [Group.announcements] 获取公告支持. 可在 [Announcements] 查看详细文档.
*
* ## 群文件
*
* 使用 [Group.files] 获取群文件管理器后操作. 详见 [RemoteFiles].
*/
@NotStableForInheritance
public interface Group : Contact, CoroutineScope, FileSupported, AudioSupported, RoamingSupported {
/**
* 群名称.
*
* 在修改时将会异步上传至服务器, 也会广播事件 [GroupNameChangeEvent].
* 频繁修改可能会被服务器拒绝.
*
* @see GroupNameChangeEvent 群名片修改事件
* @throws PermissionDeniedException 无权限修改时将会抛出异常
*/
public var name: String
/**
* 群设置
*/
public val settings: GroupSettings
/**
* 同为 groupCode, 用户看到的群号码.
*/
public override val id: Long
/**
* 群主.
*
* @return 若机器人是群主, 返回 [botAsMember]. 否则返回相应的成员
*/
public val owner: NormalMember
/**
* [Bot] 在群内的 [Member] 实例
*/
public val botAsMember: NormalMember
/**
* 机器人被禁言还剩余多少秒
*
* @see BotMuteEvent 机器人被禁言事件
* @see isBotMuted 判断机器人是否正在被禁言
*/
public val botMuteRemaining: Int get() = botAsMember.muteTimeRemaining
/**
* 机器人在这个群里的权限
*
* @see Group.checkBotPermission 检查 [Bot] 在这个群里的权限
*
* @see BotGroupPermissionChangeEvent 机器人群员修改
*/
public val botPermission: MemberPermission get() = botAsMember.permission
/**
* 群头像下载链接, 规格默认为 [AvatarSpec.LARGEST]
* @see avatarUrl
*/
public override val avatarUrl: String
get() = avatarUrl(spec = AvatarSpec.LARGEST)
/**
* 群头像下载链接.
* @param spec 头像的规格.
* @since 2.11
*/
public override fun avatarUrl(spec: AvatarSpec): String = "http://p.qlogo.cn/gh/${id}/${id}/${spec.size}"
/**
* 群成员列表, 不含机器人自己, 含群主.
*
* 在 [Group] 实例创建的时候查询一次. 并与事件同步事件更新.
*/
public val members: ContactList<NormalMember>
/**
* 获取群公告相关功能接口
* @since 2.7
*/
public val announcements: Announcements
/**
* 获取群荣誉相关功能接口
* @since 2.13
*/
public val active: GroupActive
/**
* 获取群成员实例. 不存在时返回 `null`.
*
* 当 [id] 为 [Bot.id] 时返回 [botAsMember].
*/
public operator fun get(id: Long): NormalMember?
/**
* 获取群成员实例. 不存在时抛出 [kotlin.NoSuchElementException].
*
* 当 [id] 为 [Bot.id] 时返回 [botAsMember].
*/
public fun getOrFail(id: Long): NormalMember =
get(id) ?: throw NoSuchElementException("member $id not found in group ${this.id}")
/**
* 当本群存在 [Member.id] 为 [id] 的群员时返回 `true`.
*
* 当 [id] 为 [Bot.id] 时返回 `true`
*/
public operator fun contains(id: Long): Boolean
/**
* 当 [member] 是本群成员时返回 `true`. 将同时成员 [所属群][Member.group]. 同一个用户在不同群内的 [Member] 对象不相等.
*/
public operator fun contains(member: NormalMember): Boolean = member in members
/**
* 让机器人退出这个群.
* @throws IllegalStateException 当机器人为群主时
* @return 退出成功时 true; 已经退出时 false
*/
public suspend fun quit(): Boolean
/**
* 向这个对象发送消息.
*
* 单条消息最大可发送 4500 字符或 50 张图片.
*
* @see GroupMessagePreSendEvent 发送消息前事件
* @see GroupMessagePostSendEvent 发送消息后事件
*
* @throws EventCancelledException 当发送消息事件被取消时抛出
* @throws BotIsBeingMutedException 发送群消息时若 [Bot] 被禁言抛出
* @throws MessageTooLargeException 当消息过长时抛出
* @throws IllegalArgumentException 当消息内容为空时抛出 (详见 [Message.isContentEmpty])
*
* @return 消息回执. 可进行撤回 ([MessageReceipt.recall])
*/
public override suspend fun sendMessage(message: Message): MessageReceipt<Group>
/**
* 发送纯文本消息
* @see sendMessage
*/
public override suspend fun sendMessage(message: String): MessageReceipt<Group> =
this.sendMessage(message.toPlainText())
/**
* 上传一个语音消息以备发送. 该方法已弃用且将在未来版本删除, 请使用 [uploadAudio].
*/
@Suppress("DEPRECATION", "DEPRECATION_ERROR")
@Deprecated(
"use uploadAudio",
replaceWith = ReplaceWith("uploadAudio(resource)"),
level = DeprecationLevel.HIDDEN
) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public suspend fun uploadVoice(resource: ExternalResource): net.mamoe.mirai.message.data.Voice
/**
* 将一条消息设置为群精华消息, 需要管理员或群主权限.
* 操作成功返回 `true`.
*
* @throws PermissionDeniedException 没有权限时抛出
*
* @since 2.2
*/
public suspend fun setEssenceMessage(source: MessageSource): Boolean
/**
* 群精华消息相关功能接口
*
* @since 2.15
*/
public val essences: Essences
public companion object {
/**
* 将一条消息设置为群精华消息, 需要管理员或群主权限.
* 操作成功返回 `true`.
*
* @throws PermissionDeniedException 没有权限时抛出
*
* @see Group.setEssenceMessage
* @since 2.2
*/
@JvmBlockingBridge
@JvmStatic
public suspend fun Group.setEssenceMessage(chain: MessageChain): Boolean = setEssenceMessage(chain.source)
}
}
/**
* 群设置
*
* @see Group.settings 获取群设置
*/
public interface GroupSettings {
/**
* 入群公告, 没有时为空字符串.
*
* 在修改时将会异步上传至服务器.
*
* @see GroupEntranceAnnouncementChangeEvent
* @throws PermissionDeniedException 无权限修改时将会抛出异常
* @see Announcements
* @see Group.announcements
*/
@Deprecated(
level = DeprecationLevel.HIDDEN,
message = "group.announcements.asFlow().filter { it.parameters.sendToNewMember }.firstOrNull()",
) // deprecated since 2.7
@DeprecatedSinceMirai(warningSince = "2.7", errorSince = "2.10", hiddenSince = "2.11")
public var entranceAnnouncement: String
/**
* 全体禁言状态. `true` 为开启.
*
* 当前仅能修改状态.
*
* @see GroupMuteAllEvent
* @throws PermissionDeniedException 无权限修改时将会抛出异常
*/
public var isMuteAll: Boolean
/**
* 允许群员邀请好友入群的状态. `true` 为允许
*
* 在修改时将会异步上传至服务器.
*
* @see GroupAllowMemberInviteEvent
* @throws PermissionDeniedException 无权限修改时将会抛出异常
*/
public var isAllowMemberInvite: Boolean
/**
* 自动加群审批
*/
@MiraiExperimentalApi
public val isAutoApproveEnabled: Boolean
/**
* 匿名聊天
*/
public var isAnonymousChatEnabled: Boolean
}
/**
* 同 [get]. 在一些不适合使用 [get] 的情境下使用 [getMember].
*/
@JvmSynthetic
public inline fun Group.getMember(id: Long): NormalMember? = get(id)
/**
* 同 [getMemberOrFail]. 在一些不适合使用 [getOrFail] 的情境下使用 [getMemberOrFail].
*/
@JvmSynthetic
public inline fun Group.getMemberOrFail(id: Long): NormalMember = getOrFail(id)
/**
* 返回机器人是否正在被禁言
*
* @see Group.botMuteRemaining 剩余禁言时间
*/
public inline val Group.isBotMuted: Boolean get() = this.botMuteRemaining != 0