MiraiBot 简介

不写了

功能构想

最初简单的构想只是用来管理bot会响应那些群的消息,响应那些群员的消息,然后在赋予群内bot管理员,来管理那些群员可以被禁止和bot交互。

这部分并没有设计成 指令的管理,比如开启/关闭某个指令。根本原因是我没有想好怎么实现方便一些。

功能实现

群在注册的时候获取到群的各项信息并保存起来,同时给出一个属性open来判断bot是否响应群内消息/事件。

为了方便数据入库,使用的Kotlin ORM 框架是 Ktorm 使用说明 仓库链接

QQ群实体的设计

字段: name(群名),number(群号码),open(bot是否响应),registryTime(注册时间)

1
2
3
4
5
6
7
8
//top.kagerou.data.Group.kt
interface Group : Entity<Group> {
companion object : Entity.Factory<Group>()
val number: Long
val name: String
val open: String
val registryTime :String
}

QQ群表对象的实现

在表对象中,将数据库的表名和表字段名和程序设计的类中的各字段名一一绑定起来。下面代码中引号中的内容为数据库对应名称

1
2
3
4
5
6
7
//top.kagerou.data.Groups.kt
object Groups : Table<Group>("t_group") {
val number = long("group_number").bindTo { it.number }
val name = varchar("name").bindTo { it.name }
val open = varchar("is_open").bindTo { it.open }
val registryTime = varchar("registry_time").bindTo { it.registryTime }
}

QQ群数据表的创建

1
2
3
4
5
6
7
8
create table t_group
(
group_number NUMERIC not null,
name varchar(20),
is_open varchar(10),
registry_time varchar(20),
primary key(group_number)
);

QQ群数据操作对象的实现

根据业务简单的实现了部分方法,后续有新的群信息获取的地方可以再此继续添加对应逻辑。

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
object GroupService {

//初始化配置信息
private val database = Database.connect("jdbc:sqlite:src/test/resources/Chinook.db")

fun save(name:String,number: Long){
database.insert(Groups){
set(it.number,number)
set(it.name,name)
set(it.open,"open")
set(it.registryTime, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")))
}
}

fun open(number: Long){
this.change(number,"open")
}

fun close(number: Long){
this.change(number,"close")
}

private fun change(number: Long, open:String){
database.update(Groups){
set(it.open,open)
where { it.number eq number }
}
}

fun exist(number: Long):Boolean{
val groupNumber = database
.from(Groups)
.select(Groups.number)
.where((Groups.number eq number) and (Groups.open eq "open"))
.map { row -> Groups.createEntity(row) }
return groupNumber.isNotEmpty()
}
}

在自定义监听类中添加if判断

添加了if增加判断群是否已经注册了bot并且状态为open,bot才会对应响应对应的指令功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@EventHandler
suspend fun GroupMessageEvent.NormalMessage(): ListeningStatus{
val msg = message.contentToString()
//相比较,添加了if增加判断群是否已经注册了bot并且状态为open,bot才会对应响应对应的指令功能。
if ( GroupService.exist(group.id)) {
when{
msg == "狼宝菜单" ->{
val menuMessages = "狼宝是一个个人开发的QQ机器人,当前版本0.1.5 \n当前功能:\n \t1.自定义消息:有人发[文本]你回[文本/图片] \n \t2.chatGpt: #chat[内容] \n \t3.漂流瓶:扔漂流瓶[内容]/捡漂流瓶 \n \t4.二次元图片:来张[关键词]涩图 \n狼宝使用过程中可能会收集部分信息,包含丘丘号码,昵称等,同时请勿利用狼宝发布平台违禁内容。\n如果你同意以上规范,可以输入[你好,狼宝!]来狼宝认识你。"
this.group.sendMessage(menuMessages)
}
msg == "你好,狼宝!" ->{
//todo 个人群成员注册
}
}
}
return ListeningStatus.LISTENING
}

结语

QQ群的权限管理比简单和单一,之后不出意外还会有对QQ群员的更细致的一个权限管理体系的设计和开发,因为重来没有对用户系统的设计和开发经验,这一块真的脑壳疼😣

下一章应该是实用的一些Bot功能的实现了。