-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathmain.py
520 lines (495 loc) · 24.9 KB
/
main.py
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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
import os
import argparse
import json
from utils.basicConfigs import setConfigs
from typing import List, Tuple, Any, Dict, Optional
config:Optional[Dict[str, Any]] = None
if __name__ == '__main__':
# 为了兼容之前的代码这么写的,太丑了,下次一定重构
parser = argparse.ArgumentParser()
parser.add_argument('--config', type=str, required=False, default=None)
args = parser.parse_args()
if args.config != None:
with open(args.config, 'r') as f:
config = json.load(f)
setConfigs(config)
import asyncio, json
from enum import IntEnum
from utils.standardPlugin import NotPublishedException
from utils.basicConfigs import APPLY_GROUP_ID, BACKEND, BACKEND_TYPE, BOT_SELF_QQ
from utils.configsLoader import createApplyGroupsSql, loadApplyGroupId
from utils.accountOperation import create_account_sql
from utils.standardPlugin import (
StandardPlugin, PluginGroupManager, EmptyPlugin, emptyFunction,
PokeStandardPlugin, AddGroupStandardPlugin,
EmptyAddGroupPlugin,GuildStandardPlugin
)
from utils.sqlUtils import createBotDataDb
from utils.configAPI import createGlobalConfig, removeInvalidGroupConfigs
from utils.basicEvent import get_group_list, warning, set_friend_add_request, set_group_add_request
from utils.messageChain import MessageChain
from utils.imageBed import createImageBedSql
from plugins.autoRepoke import AutoRepoke
from plugins.faq_v2 import MaintainFAQ, AskFAQ, HelpFAQ
from plugins.groupCalendar import GroupCalendarHelper, GroupCalendarManager
from plugins.greetings import MorningGreet, NightGreet
from plugins.checkCoins import CheckCoins, AddAssignedCoins, CheckTransactions
from plugins.superEmoji import FirecrackersFace, FireworksFace, BasketballFace, HotFace
from plugins.news import ShowNews, YesterdayNews, UpdateNewsAndReport
from plugins.hotSearch import WeiboHotSearch, BaiduHotSearch, ZhihuHotSearch
## tmp
from plugins.signIn import SignIn
from plugins.thanksLUB import ThanksLUB
from plugins.stocks import QueryStocksHelper, QueryStocks, BuyStocksHelper, BuyStocks, QueryStocksPriceHelper, QueryStocksPrice
from plugins.sjtuInfo import SjtuCanteenInfo, SjtuLibInfo
from plugins.sjmcStatus_v2 import ShowSjmcStatus
from plugins.sjmcStatus_v4 import ShowMcStatus, McStatusAddServer, McStatusRemoveServer, McStatusSetFooter, McStatusRemoveFooter
try:
from plugins.mua import (MuaAnnHelper, MuaAnnEditor,
MuaTokenBinder, MuaTokenUnbinder, MuaTokenEmpower,
MuaTokenLister, MuaNotice, MuaQuery, MuaAbstract,
MuaGroupBindTarget, MuaGroupUnbindTarget, MuaGroupAnnFilter,
startMuaInstanceMainloop, setMuaCredential)
except NotPublishedException as e:
print('mua plugins not imported: {}'.format(e))
MuaAnnHelper, MuaAnnEditor = EmptyPlugin, EmptyPlugin
MuaTokenBinder, MuaTokenUnbinder, MuaTokenEmpower = EmptyPlugin, EmptyPlugin, EmptyPlugin
uaTokenLister, MuaNotice, MuaQuery, MuaAbstract = EmptyPlugin, EmptyPlugin, EmptyPlugin, EmptyPlugin
MuaGroupBindTarget, MuaGroupUnbindTarget = EmptyPlugin, EmptyPlugin
MuaGroupAnnFilter = EmptyPlugin
MuaTokenLister = EmptyPlugin
startMuaInstanceMainloop, setMuaCredential = emptyFunction, emptyFunction
from plugins.roulette import RoulettePlugin
from plugins.lottery import LotteryPlugin
from plugins.help_v2 import ShowHelp, ShowStatus, ServerMonitor, CheckStatus
from plugins.groupBan import GroupBan, UserBan, BanImplement, GetBanList
from plugins.privateControl import PrivateControl, LsGroup, GroupApply, HelpInGroup
from plugins.BilibiliApiV3 import BilibiliSubscribe, BilibiliSubscribeHelper
try:
from plugins.chatWithNLP import ChatWithNLP
except Exception as e:
ChatWithNLP = EmptyPlugin
print('ChatWithNLP not imported: {}'.format(e))
from plugins.chatWithAnswerbook import ChatWithAnswerbook
from plugins.getJwc import GetSjtuNews, GetJwc, SjtuJwcMonitor#, SubscribeJwc
from plugins.sjtuSchoolGate import SjtuSchoolGate
from plugins.sjtuBwc import SjtuBwc, SjtuBwcMonitor
from plugins.canvasSync import CanvasiCalBind, CanvasiCalUnbind, GetCanvas
from plugins.getPermission import GetPermission, AddPermission, DelPermission, ShowPermission, AddGroupAdminToBotAdmin
# from plugins.goBang import GoBangPlugin
from plugins.messageRecorder import GroupMessageRecorder
from plugins.addGroupRecorder import AddGroupRecorder
from plugins.fileRecorder import GroupFileRecorder
from plugins.bilibiliLive import GetBilibiliLive, BilibiliLiveMonitor
from plugins.deprecated.sjmcLive import GetSjmcLive
# from plugins.advertisement import McAdManager
from plugins.groupActReport import ActReportPlugin, ActRankPlugin, YourActReportPlugin
from plugins.groupWordCloud import wordCloudPlugin, GenWordCloud, GenPersonWordCloud
from plugins.randomNum import TarotRandom, RandomNum, ThreeKingdomsRandom
from plugins.sjtuClassroom import SjtuClassroom, SjtuClassroomRecommend, SjtuClassroomPeopleNum, SjtuJsQuery
from plugins.sjtuClassroomRecorder import SjtuClassroomRecorder, DrawClassroomPeopleCount
from plugins.sjtuActivity import SjtuActivity, SjtuDektMonitor
from plugins.makeJoke import MakeJoke
from plugins.uniAgenda import GetUniAgenda
from plugins.chess import ChessPlugin, ChessHelper
from plugins.charPic import CharPic
from plugins.cchess import ChineseChessPlugin, ChineseChessHelper
# from plugins.song import ChooseSong # API坏了
from plugins.zsmCorups import ZsmGoldSentence
from plugins.clearRecord import ClearRecord, RestoreRecord
from plugins.bilibiliLive import GetBilibiliLive, BilibiliLiveMonitor
from plugins.wordle import Wordle, WordleHelper
from plugins.handle import Handle, HandleHelper
from plugins.mathler import Mathler, MathlerHelper
from plugins.emojiKitchen import EmojiKitchen
from plugins.leetcode import ShowLeetcode, LeetcodeReport
from plugins.abstract import MakeAbstract
from plugins.eavesdrop import Eavesdrop
from plugins.sendLike import SendLike
from plugins.notPublished.jile import Chai_Jile, Yuan_Jile
from plugins.notPublished.getMddStatus import GetMddStatus, MonitorMddStatus#, SubscribeMdd
from plugins.sjtuElectromobileCharge import GetSjtuCharge
try:
from plugins.notPublished.EE0502 import ShowEE0502Comments
except NotPublishedException as e:
ShowEE0502Comments = EmptyPlugin
print('ShowEE0502Comments not imported: {}'.format(e))
try:
from plugins.notPublished.sjtuPlusGroupingVerication import SjtuPlusGroupingVerify
except NotPublishedException as e:
SjtuPlusGroupingVerify = EmptyAddGroupPlugin
print('SjtuPlusGroupingVerify not imported: {}'.format(e))
try:
from plugins.notPublished.smpParkourRank import SMPParkourRank
except NotPublishedException as e:
SMPParkourRank = EmptyAddGroupPlugin
print('SMPParkourRank not imported: {}'.format(e))
from plugins.gocqWatchDog import GocqWatchDog
###### end not published plugins
def sqlInit():
createBotDataDb()
createApplyGroupsSql()
createGlobalConfig()
create_account_sql()
createImageBedSql()
loadApplyGroupId()
# removeInvalidGroupConfigs() # it may danger, consider change it to add tag
sqlInit() # put this after import
ROOT_PATH = os.path.dirname(os.path.realpath(__file__))
RESOURCES_PATH = os.path.join(ROOT_PATH, "resources")
# 根据config初始化
cchessConfig = {}
bilibiliSubscribe = EmptyPlugin()
bilibiliSubscribeHelper = EmptyPlugin()
watchdogMail = None
chaiJile = EmptyPlugin()
yuanJile = EmptyPlugin()
getMddStatus = EmptyPlugin()
monitorMddStatus = EmptyPlugin()
sjtuActivity = EmptyPlugin()
sjtuDektMonitor = EmptyPlugin()
getSjtuCharge = EmptyPlugin()
sjtuPlusGroups = []
if isinstance(config, dict):
pluginConfigs:Optional[Dict[str, Any]] = config.get('plugins', None)
if pluginConfigs != None:
# mua plugin
if 'mua' in pluginConfigs.keys():
print('[INFO] 开启MUA插件组')
muaConfig = pluginConfigs['mua']
setMuaCredential(muaConfig['BOT_MUA_ID'], muaConfig['BOT_MUA_TOKEN'], muaConfig['MUA_URL'])
startMuaInstanceMainloop()
else:
print('[WARNING] MUA插件组未开启')
if "cchess" in pluginConfigs.keys():
print("[INFO] 开启cchess软件")
cchessConfig = pluginConfigs['cchess']
else:
print("[WARNING] cchess软件未配置")
if "bilibili" in pluginConfigs.keys():
bilibiliSubscribe = BilibiliSubscribe(pluginConfigs['bilibili']['credential'])
bilibiliSubscribeHelper = BilibiliSubscribeHelper()
print("[INFO] 开启bilibili订阅插件")
else:
print("[WARNING] bilibili订阅插件未开启")
if "watchdog" in pluginConfigs.keys():
watchdogMail = pluginConfigs["watchdog"]
if "jile" in pluginConfigs.keys():
chaiJile = Chai_Jile(pluginConfigs["jile"]["chai_qq"])
yuanJile = Yuan_Jile(pluginConfigs["jile"]["yuan_qq"])
print("[INFO] 开启jile插件")
else:
print("[WARNING] jile插件未开启")
if "mdd" in pluginConfigs.keys():
getMddStatus = GetMddStatus(pluginConfigs["mdd"]["mdd_url"], pluginConfigs["mdd"]["mdd_headers"])
monitorMddStatus = MonitorMddStatus(pluginConfigs["mdd"]["mdd_url"], pluginConfigs["mdd"]["mdd_headers"])
print("[INFO] 开启mdd插件")
else:
print('[WARNING] mdd插件未开启')
if "sjtu_dekt_v2" in pluginConfigs.keys():
sjtuActivity = SjtuActivity(pluginConfigs["sjtu_dekt_v2"]["JAC_COOKIE"],pluginConfigs["sjtu_dekt_v2"]["client_id"])
sjtuDektMonitor = SjtuDektMonitor(pluginConfigs["sjtu_dekt_v2"]["JAC_COOKIE"],pluginConfigs["sjtu_dekt_v2"]["client_id"])
print("[INFO] 开启sjtu第二课堂插件")
else:
print("[WARNING] sjtu第二课堂插件未开启")
if "add_group_verify" in pluginConfigs.keys():
for cfg in pluginConfigs["add_group_verify"]["groups"]:
sjtuPlusGroups.append(SjtuPlusGroupingVerify(
cfg['sjtu_plus_key'], cfg['api_name'], cfg['groups_qq']
))
if "sjtu_electron_mobile" in pluginConfigs.keys():
cfg = pluginConfigs["sjtu_electron_mobile"]
getSjtuCharge = GetSjtuCharge(cfg["JAC_COOKIE"], cfg["client_id"], cfg["url"])
print("[INFO] 开启sjtu电动车充电信息插件")
else:
print("[WARNING] sjtu电动车充电信息插件未开启")
# if 'xxx' in in pluginConfigs.keys():
# 特殊插件需要复用的放在这里
helper = ShowHelp() # 帮助插件
helperForPrivateControl = HelpInGroup() # BOT管理员查看群聊功能开启情况插件
if watchdogMail != None:
gocqWatchDog = GocqWatchDog(60, mail_user=watchdogMail['mail_user'], mail_pass=watchdogMail['mail_pass'])
else:
gocqWatchDog = None
groupMessageRecorder = GroupMessageRecorder() # 群聊消息记录插件
sjtuClassroomRecorder = SjtuClassroomRecorder()
banImpl = BanImplement()
GroupPluginList:List[StandardPlugin]=[ # 指定群启用插件
groupMessageRecorder, banImpl,
helper,ShowStatus(),ServerMonitor(), # 帮助
GetPermission(), ThanksLUB(), Eavesdrop(),
PluginGroupManager([AddPermission(), DelPermission(), ShowPermission(), AddGroupAdminToBotAdmin(),
UserBan(banImpl), GetBanList()], 'permission'), # 权限
PluginGroupManager([AskFAQ(), MaintainFAQ(), HelpFAQ()],'faq'), # 问答库与维护
PluginGroupManager([GroupCalendarHelper(), GroupCalendarManager()], 'calendar'),
PluginGroupManager([MorningGreet(), NightGreet()], 'greeting'), # 早安晚安
PluginGroupManager([CheckCoins(), AddAssignedCoins(),CheckTransactions()],'money'), # 查询金币,查询记录,增加金币(管理员)
PluginGroupManager([FireworksFace(), FirecrackersFace(), BasketballFace(), HotFace(), MakeJoke()], 'superemoji'), # 超级表情
PluginGroupManager([ShowNews(), YesterdayNews(),
PluginGroupManager([UpdateNewsAndReport(), ], 'newsreport')],'news'), # 新闻
PluginGroupManager([WeiboHotSearch(), BaiduHotSearch(), ZhihuHotSearch(),], 'hotsearch'),
PluginGroupManager([SjtuCanteenInfo(),SjtuLibInfo(), SjtuClassroom(), SjtuClassroomPeopleNum(),
DrawClassroomPeopleCount(), SjtuSchoolGate(), SjtuJsQuery(),
SjtuClassroomRecommend(), getMddStatus, getSjtuCharge, sjtuActivity, #SubscribeMdd(), # 交大餐厅, 图书馆, 核酸点, 麦当劳
PluginGroupManager([monitorMddStatus], 'mddmonitor'),
PluginGroupManager([sjtuDektMonitor], 'dektmonitor'),], 'sjtuinfo'),
# PluginGroupManager([QueryStocksHelper(), QueryStocks(), BuyStocksHelper(), BuyStocks(), QueryStocksPriceHelper(), QueryStocksPrice()],'stocks'), # 股票
PluginGroupManager([chaiJile, yuanJile],'jile'), # 柴/元神寄了
PluginGroupManager([SignIn(), ], 'signin'), # 签到
PluginGroupManager([ShowSjmcStatus(), GetSjmcLive(), GetBilibiliLive(24716629, '基岩社', '-fdmclive'), SMPParkourRank(),
PluginGroupManager([BilibiliLiveMonitor(25567444, '交大MC社', 'mclive'),
BilibiliLiveMonitor(24716629, '基岩社', 'mclive'), ], 'mclive'),
# PluginGroupManager([McAdManager()], 'mcad')# 新生群mc广告播报
], 'sjmc'), #MC社服务
PluginGroupManager([ShowMcStatus(), McStatusAddServer(), McStatusRemoveServer(), McStatusSetFooter(), McStatusRemoveFooter()
], 'mcs'), #MC服务器列表for MUA
PluginGroupManager([MuaQuery(), MuaAbstract(), MuaAnnHelper(), MuaAnnEditor(),
MuaTokenBinder(), MuaTokenUnbinder(), MuaTokenEmpower(), MuaTokenLister(),
MuaGroupBindTarget(), MuaGroupUnbindTarget(), MuaGroupAnnFilter(),
GetBilibiliLive(30539032, 'MUA', '-mualive'),
PluginGroupManager([MuaNotice()], 'muanotice'),
PluginGroupManager([BilibiliLiveMonitor(30539032, 'MUA', 'mualive'),], 'mualive'),
], 'mua'), #MC高校联盟服务
PluginGroupManager([GetJwc(), SjtuBwc(), #SubscribeJwc() ,
SjtuJwcMonitor(), GetSjtuNews(),# jwc服务, jwc广播, 交大新闻
PluginGroupManager([SjtuBwcMonitor()], 'bwcreport'),], 'jwc'),
PluginGroupManager([RoulettePlugin()],'roulette'), # 轮盘赌
PluginGroupManager([LotteryPlugin()],'lottery'), # 彩票 TODO
# PluginGroupManager([GoBangPlugin()],'gobang'),
PluginGroupManager([ChatWithAnswerbook(), ChatWithNLP()], 'chat'), # 答案之书/NLP
PluginGroupManager([GetCanvas(), GetUniAgenda(), CanvasiCalBind(), CanvasiCalUnbind()], 'canvas'), # 日历馈送
# PluginGroupManager([DropOut()], 'dropout'), # 一键退学
PluginGroupManager([ShowEE0502Comments(), ZsmGoldSentence(), MakeAbstract()], 'izf'), # 张峰
PluginGroupManager([ActReportPlugin(), YourActReportPlugin(), ActRankPlugin(), wordCloudPlugin(),
ClearRecord(), RestoreRecord(), GenPersonWordCloud(),
PluginGroupManager([GenWordCloud()], 'wcdaily')], 'actreport'), #水群报告
PluginGroupManager([RandomNum(), ThreeKingdomsRandom(), TarotRandom()], 'random'),
PluginGroupManager([bilibiliSubscribeHelper, bilibiliSubscribe], 'bilibili'),
PluginGroupManager([ChineseChessPlugin(cchessConfig.get('engine_type', 'uci'),
cchessConfig.get('engine_path', None),
cchessConfig.get('engine_options', {})), ChineseChessHelper()], 'cchess'),
PluginGroupManager([ChessPlugin(), ChessHelper()], 'chess'),
PluginGroupManager([Wordle(), WordleHelper(), Handle(), HandleHelper(), Mathler(), MathlerHelper()], 'wordle'),
PluginGroupManager([CharPic(), GroupBan(),
GetBilibiliLive(22797301, 'SJTU计算机系', '-sjcs'),
BilibiliLiveMonitor(22797301,'SJTU计算机系', 'test'),], 'test'),
PluginGroupManager([EmojiKitchen()], 'emoji'),
PluginGroupManager([ShowLeetcode(), LeetcodeReport()], 'leetcode'),
PluginGroupManager([SendLike()], 'likes'),
]
PrivatePluginList:List[StandardPlugin]=[ # 私聊启用插件
helper, ThanksLUB(), CheckStatus(GroupPluginList),
ShowStatus(),ServerMonitor(),
LsGroup(), GroupApply(), PrivateControl(), helperForPrivateControl,
CheckCoins(),AddAssignedCoins(),CheckTransactions(),
ShowNews(), YesterdayNews(),
MorningGreet(), NightGreet(),
SignIn(), SendLike(),
QueryStocksHelper(), QueryStocks(), BuyStocksHelper(), BuyStocks(), QueryStocksPriceHelper(), QueryStocksPrice(),
SjtuCanteenInfo(),SjtuLibInfo(),ShowSjmcStatus(),GetJwc(), SjtuBwc(), getSjtuCharge, sjtuActivity,#SubscribeJwc(),
MuaAbstract(), MuaQuery(), MuaAnnHelper(), MuaAnnEditor(),
MuaTokenBinder(), MuaTokenUnbinder(), MuaTokenEmpower(), MuaTokenLister(),
GetSjtuNews(),
LotteryPlugin(),
GetCanvas(), CanvasiCalBind(), CanvasiCalUnbind(), GetUniAgenda(),
ShowEE0502Comments(), ZsmGoldSentence(),
GetSjmcLive(), GetBilibiliLive(24716629, '基岩社', '-fdmclive'),
getMddStatus, #SubscribeMdd(),
SearchSjtuSqlAllPrivate(),
RandomNum(), ThreeKingdomsRandom(), TarotRandom(),
EmojiKitchen(),
# ChooseSong(),
SjtuJsQuery(),
SjtuClassroom(), SjtuClassroomPeopleNum(), SjtuClassroomRecommend(), DrawClassroomPeopleCount(), SjtuSchoolGate(),
]
GuildPluginList:List[GuildStandardPlugin] = []
GroupPokeList:List[PokeStandardPlugin] = [
AutoRepoke(), # 自动回复拍一拍
]
AddGroupVerifyPluginList:List[AddGroupStandardPlugin] = [
AddGroupRecorder(), # place this plugin to the first place
*sjtuPlusGroups,
]
helper.updatePluginList(GroupPluginList, PrivatePluginList)
helperForPrivateControl.setPluginList(GroupPluginList)
class NoticeType(IntEnum):
NoProcessRequired = 0
GroupMessageNoProcessRequired = 1
GuildMessageNoProcessRequired = 2
PrivateMessageNoProcessRequired = 3
GocqHeartBeat = 5
GroupMessage = 11
GroupPoke = 12
GroupRecall = 13
GroupUpload = 14
PrivateMessage = 21
PrivatePoke = 22
PrivateRecall = 23
AddGroup = 31 # 有人要求加入自己的群
AddPrivate = 32
AddGroupInvite = 33 # 有人邀请自己加入新群
GuildMessage = 41
def eventClassify(json_data: dict)->NoticeType:
"""事件分类"""
if json_data['post_type'] == 'meta_event' and json_data['meta_event_type'] == 'heartbeat':
return NoticeType.GocqHeartBeat
elif json_data['post_type'] == 'message':
if json_data['message_type'] == 'group':
if json_data['user_id'] == BOT_SELF_QQ:
return NoticeType.GroupMessageNoProcessRequired
elif json_data['group_id'] in APPLY_GROUP_ID:
return NoticeType.GroupMessage
else:
return NoticeType.GroupMessageNoProcessRequired
elif json_data['message_type'] == 'private':
if json_data['user_id'] == BOT_SELF_QQ:
return NoticeType.PrivateMessageNoProcessRequired
else:
return NoticeType.PrivateMessage
elif json_data['message_type'] == 'guild':
if (json_data['guild_id'], json_data['channel_id']) in []:
return NoticeType.GuildMessage
else:
return NoticeType.GuildMessageNoProcessRequired
elif json_data['post_type'] == 'notice':
if json_data['notice_type'] == 'notify':
if json_data['sub_type'] == "poke":
if json_data.get('group_id', None) in APPLY_GROUP_ID:
return NoticeType.GroupPoke
elif json_data['notice_type'] == 'group_recall':
return NoticeType.GroupRecall
elif json_data['notice_type'] == 'group_upload':
return NoticeType.GroupUpload
elif json_data['post_type'] == 'request':
if json_data['request_type'] == 'friend':
return NoticeType.AddPrivate
elif json_data['request_type'] == 'group':
if json_data['sub_type'] == 'add':
return NoticeType.AddGroup
elif json_data['sub_type'] == 'invite':
return NoticeType.AddGroupInvite
else:
return NoticeType.NoProcessRequired
def onMessageReceive(message:str)->str:
data:Dict[str,Any] = json.loads(message)
# 筛选并处理指定事件
flag=eventClassify(data)
# print(data)
# 消息格式转换
if BACKEND == BACKEND_TYPE.LAGRANGE and 'message' in data.keys():
msgChain = MessageChain(data['message'])
msgChain.fixLagrangeImgUrl()
msgOrigin = msgChain.toCqcode()
msg = msgOrigin.strip()
data['message_chain'] = data['message']
data['message'] = msgOrigin
# print(msg)
if flag==NoticeType.GroupMessage: # 群消息处理
msg = data['message'].strip()
for event in GroupPluginList:
event: StandardPlugin
try:
if event.judgeTrigger(msg, data):
ret = event.executeEvent(msg, data)
if ret != None:
return ret
except TypeError as e:
warning("type error in main.py: {}\n\n{}".format(e, event))
elif flag == NoticeType.GroupMessageNoProcessRequired:
groupMessageRecorder.executeEvent(data['message'], data)
elif flag == NoticeType.GroupRecall:
for plugin in [groupMessageRecorder]:
plugin.recallMessage(data)
# 频道消息处理
elif flag == NoticeType.GuildMessage:
msg = data['message'].strip()
for plugin in GuildPluginList:
plugin: GuildStandardPlugin
try:
if plugin.judgeTrigger(msg, data):
ret = plugin.executeEvent(msg, data)
if ret != None:
return ret
except TypeError as e:
warning("type error in main.py: {}\n\n{}".format(e, plugin))
except BaseException as e:
warning('base exception in main.py guild plugin: {}\n\n{}'.format(e, plugin))
# 私聊消息处理
elif flag == NoticeType.PrivateMessage:
# print(data)
msg=data['message'].strip()
for event in PrivatePluginList:
if event.judgeTrigger(msg, data):
if event.executeEvent(msg, data)!=None:
break
elif flag == NoticeType.AddGroup:
for p in AddGroupVerifyPluginList:
if p.judgeTrigger(data):
if p.addGroupVerication(data) != None:
break
# 上传文件处理
elif flag == NoticeType.GroupUpload:
for event in [GroupFileRecorder()]:
event.uploadFile(data)
# 群内拍一拍回拍
elif flag==NoticeType.GroupPoke:
for p in GroupPokeList:
if p.judgeTrigger(data):
if p.pokeMessage(data)!=None:
break
# 自动加好友
elif flag==NoticeType.AddPrivate:
set_friend_add_request(data['flag'], True)
# 自动通过加群邀请
elif flag==NoticeType.AddGroupInvite:
set_group_add_request(data['flag'], data['sub_type'], True)
elif flag==NoticeType.GocqHeartBeat:
if gocqWatchDog != None:
gocqWatchDog.feed()
return "OK"
def initCheck():
# do some check
for p in GroupPluginList:
infoDict = p.getPluginInfo()
if not p.initCheck():
print(f'{infoDict} init check failed!')
exit(1)
if 'group' not in infoDict['usePlace']:
print("plugin [{}] can not be used in group talk!".format(infoDict['name']))
exit(1)
for p in PrivatePluginList:
infoDict = p.getPluginInfo()
if not p.initCheck():
print(f'{infoDict} init check failed!')
exit(1)
if 'private' not in infoDict['usePlace']:
print("plugin [{}] can not be used in private talk!".format(infoDict['name']))
exit(1)
if gocqWatchDog != None:
gocqWatchDog.start()
if __name__ == '__main__':
initCheck()
if BACKEND == BACKEND_TYPE.GOCQHTTP:
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["POST"])
def onMsgRecvGocq():
msg = request.get_data(as_text=True)
return onMessageReceive(msg)
if config == None:
app.run(host="127.0.0.1", port=5986)
else:
app.run(host=config['frontend-ip'], port=config['frontend-port'])
elif BACKEND == BACKEND_TYPE.LAGRANGE:
from websocket_server import WebsocketServer
if config == None:
server = WebsocketServer("127.0.0.1", port=5706)
else:
server = WebsocketServer(config['frontend-ip'], port=config['frontend-port'])
def onMsgRecvLag(_0, _1, msg):
onMessageReceive(msg)
server.set_fn_message_received(onMsgRecvLag)
print('-------------You can start Lagrange Now----------------')
server.run_forever()
else:
print('invalid backend type')