上传代码和配置文件
This commit is contained in:
parent
2a6c82b1eb
commit
bab9298511
4
.env.dev
Normal file
4
.env.dev
Normal file
@ -0,0 +1,4 @@
|
||||
HOST=0.0.0.0
|
||||
PORT=4399
|
||||
DEBUG=true
|
||||
COMMAND_START=["#"]
|
||||
4
.env.prod
Normal file
4
.env.prod
Normal file
@ -0,0 +1,4 @@
|
||||
HOST=0.0.0.0
|
||||
PORT=4399
|
||||
DEBUG=false
|
||||
COMMAND_START=["#"]
|
||||
25
bot.py
Normal file
25
bot.py
Normal file
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
|
||||
import nonebot
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot as CQHTTPBot
|
||||
|
||||
|
||||
# 若 data 文件夹不存在则创建
|
||||
if os.path.exists('data') == False:
|
||||
os.mkdir('data')
|
||||
|
||||
# dev 环境下监控 src config 文件夹变动
|
||||
nonebot.init(fastapi_reload_dirs=['src', 'config'])
|
||||
|
||||
logger.add("./logs/{time:YYYY-MM-DD}.log", rotation="0:00")
|
||||
|
||||
app = nonebot.get_asgi()
|
||||
|
||||
driver = nonebot.get_driver()
|
||||
driver.register_adapter("cqhttp", CQHTTPBot)
|
||||
|
||||
nonebot.load_from_toml("pyproject.toml")
|
||||
5
config/bilibililive_checker.json
Normal file
5
config/bilibililive_checker.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"enable": false,
|
||||
"group": [],
|
||||
"liveroom": []
|
||||
}
|
||||
40
config/cmd_alias.json
Normal file
40
config/cmd_alias.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"help": {
|
||||
"cmd": "帮助",
|
||||
"aliases": []
|
||||
},
|
||||
"bind_qq": {
|
||||
"cmd": "绑定",
|
||||
"aliases": [
|
||||
"绑定账号"
|
||||
]
|
||||
},
|
||||
"call_admin": {
|
||||
"cmd": "呼叫管理员",
|
||||
"aliases": []
|
||||
},
|
||||
"get_invitation": {
|
||||
"cmd": "邀请码",
|
||||
"aliases": []
|
||||
},
|
||||
"issue_cmd": {
|
||||
"cmd": "命令",
|
||||
"aliases": []
|
||||
},
|
||||
"query_online": {
|
||||
"cmd": "在线人数",
|
||||
"aliases": []
|
||||
},
|
||||
"say_mc_msg": {
|
||||
"cmd": "服务器",
|
||||
"aliases": []
|
||||
},
|
||||
"tell_mc_msg": {
|
||||
"cmd": "私聊",
|
||||
"aliases": []
|
||||
},
|
||||
"welcome": {
|
||||
"cmd": "欢迎",
|
||||
"aliases": []
|
||||
}
|
||||
}
|
||||
58
config/cmd_register.json
Normal file
58
config/cmd_register.json
Normal file
@ -0,0 +1,58 @@
|
||||
[
|
||||
{
|
||||
"cmd": "list",
|
||||
"aliases": [
|
||||
"在线列表"
|
||||
],
|
||||
"no_arg": true,
|
||||
"num": 1,
|
||||
"wait_time": 1,
|
||||
"server_tag": "主服",
|
||||
"allow_member": [],
|
||||
"permission": "ALL"
|
||||
},
|
||||
{
|
||||
"cmd": "tps",
|
||||
"aliases": [
|
||||
"运行状态"
|
||||
],
|
||||
"no_arg": true,
|
||||
"num": 1,
|
||||
"wait_time": 1,
|
||||
"server_tag": "主服",
|
||||
"allow_member": [],
|
||||
"permission": "ADMIN"
|
||||
},
|
||||
{
|
||||
"cmd": "op",
|
||||
"aliases": [],
|
||||
"no_arg": false,
|
||||
"num": 1,
|
||||
"wait_time": 1,
|
||||
"server_tag": "主服",
|
||||
"allow_member": [],
|
||||
"permission": "OP"
|
||||
},
|
||||
{
|
||||
"cmd": "deop",
|
||||
"aliases": [],
|
||||
"no_arg": false,
|
||||
"num": 1,
|
||||
"wait_time": 1,
|
||||
"server_tag": "主服",
|
||||
"allow_member": [],
|
||||
"permission": "OP"
|
||||
},
|
||||
{
|
||||
"cmd": "lp editor",
|
||||
"aliases": [
|
||||
"权限编辑"
|
||||
],
|
||||
"no_arg": true,
|
||||
"num": 3,
|
||||
"wait_time": 5,
|
||||
"server_tag": "主服",
|
||||
"allow_member": [],
|
||||
"permission": "OP"
|
||||
}
|
||||
]
|
||||
11
config/get_invitation.json
Normal file
11
config/get_invitation.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"enable": false,
|
||||
"blessing_skin_server_mysql": {
|
||||
"host": "127.0.0.1",
|
||||
"port": 3306,
|
||||
"user": "skin",
|
||||
"password": "",
|
||||
"db": "skin"
|
||||
},
|
||||
"initial_chance": 0
|
||||
}
|
||||
5
config/group.json
Normal file
5
config/group.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"main_group": 123456789,
|
||||
"op_user": [],
|
||||
"admin_user": []
|
||||
}
|
||||
11
config/mc_event.json
Normal file
11
config/mc_event.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"enable": {
|
||||
"server_start": true,
|
||||
"server_stop": true,
|
||||
"player_join": true,
|
||||
"player_advancement": true,
|
||||
"player_chat": true,
|
||||
"player_quit": true,
|
||||
"player_quit_private": true
|
||||
}
|
||||
}
|
||||
13
config/mc_server.json
Normal file
13
config/mc_server.json
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
"main_server_tag": "主服",
|
||||
"server": [
|
||||
{
|
||||
"tag": "主服",
|
||||
"url": "http://127.0.0.1:8520"
|
||||
},
|
||||
{
|
||||
"tag": "游戏服",
|
||||
"url": "http://192.168.1.2:8520"
|
||||
}
|
||||
]
|
||||
}
|
||||
67
config/text.json
Normal file
67
config/text.json
Normal file
@ -0,0 +1,67 @@
|
||||
{
|
||||
"not_enable": "此功能未开启!",
|
||||
"bilibililive_checker": {
|
||||
"message": "主播<name>开播啦!\n房间标题:<title>\n直播分区:<area>\n快去<url>围观吧!\n"
|
||||
},
|
||||
"bind_qq": {
|
||||
"help": "#绑定 ID | 将游戏 ID 和 QQ 号绑定",
|
||||
"format_error": "发送格式错误!\n发送格式:#绑定 ID",
|
||||
"not_bind_msg_in_game": "§4<player>,看起来您尚未将游戏账号和QQ号绑定,请在群内使用 #绑定 <player> 绑定您的账号\n如果您对此消息感到疑惑,请联系管理员",
|
||||
"not_bind_when_send_msg": "请先通过 #绑定 ID 绑定您的游戏账号!",
|
||||
"already_bind": "您已经绑定过账号!如果您对此感到疑惑,请联系管理员",
|
||||
"player_not_exist": "您要绑定的玩家不存在!请确认曾登录过以及输入正确",
|
||||
"success": "绑定成功!"
|
||||
},
|
||||
"call_admin": {
|
||||
"help": "#呼叫管理员 内容 | 向管理员发送消息",
|
||||
"format_error": "发送格式错误!\n发送格式:#呼叫管理员 内容"
|
||||
},
|
||||
"cmd_register": {
|
||||
"help": "#在线排行 | 查询服务器在线排行\n#tps | 查询服务器 TPS",
|
||||
"no_permission": "您没有向服务器发送此命令的权限!",
|
||||
"extra_arg": "此命令不能添加参数!",
|
||||
"answer": "已执行!\n<res>"
|
||||
},
|
||||
"get_invitation": {
|
||||
"help": "#邀请码 | 索取皮肤站邀请码",
|
||||
"get_msg": "您的邀请码为:<code>",
|
||||
"no_chance": "您已耗尽邀请码次数!请联系管理员"
|
||||
},
|
||||
"help": {
|
||||
"help": "#帮助 | 查看机器人帮助"
|
||||
},
|
||||
"issue_cmd": {
|
||||
"no_permission": "您没有向服务器发送命令的权限!",
|
||||
"format_error": "发送格式错误!\n发送格式:#命令 命令,回传行数,等待执行时间,服务器tag",
|
||||
"server_tag_not_exist": "服务器不存在!",
|
||||
"answer": "已执行!\n<res>"
|
||||
},
|
||||
"mc_event": {
|
||||
"server_start": "<tag>已开启,用时<time>s",
|
||||
"server_stop": "<tag>已关闭",
|
||||
"player_join": "<player>加入了<tag>",
|
||||
"player_advancement": "<player>在<tag>中取得了进度[<advancement>]",
|
||||
"player_chat": "<tag>中的<player>:<message>",
|
||||
"player_quit": "<player>退出了<tag>",
|
||||
"player_quit_private": "你退出了<tag>,请检查是否为掉线"
|
||||
},
|
||||
"query_online": {
|
||||
"help": "#在线人数 | 查询服务器在线人数",
|
||||
"no_player": "当前<tag>无人在线",
|
||||
"list_player": "<tag>当前有<num>人在线:<list>"
|
||||
},
|
||||
"say_mc_msg": {
|
||||
"help": "#服务器 内容 | 向服务器发送消息",
|
||||
"format_error": "发送格式错误!\n发送格式:#服务器 内容",
|
||||
"msg_in_game": "§5[QQ] §f<bind_player> <msg>"
|
||||
},
|
||||
"tell_mc_msg": {
|
||||
"help": "#私聊 ID 内容 | 向服务器内玩家私发消息",
|
||||
"format_error": "发送格式错误!\n发送格式:#私聊 ID 内容",
|
||||
"msg_in_game": "§5[QQ] §f<bind_player> 向你私聊消息:<msg>"
|
||||
},
|
||||
"welcome": {
|
||||
"help": "#欢迎 @新人 | 欢迎新人",
|
||||
"message": "欢迎来到服务器!"
|
||||
}
|
||||
}
|
||||
358
data/advancement_translation.json
Normal file
358
data/advancement_translation.json
Normal file
@ -0,0 +1,358 @@
|
||||
[
|
||||
{
|
||||
"en": "Stone Age",
|
||||
"zh_cn": "石器时代"
|
||||
},
|
||||
{
|
||||
"en": "Getting an Upgrade",
|
||||
"zh_cn": "获得升级"
|
||||
},
|
||||
{
|
||||
"en": "Acquire Hardware",
|
||||
"zh_cn": "来硬的"
|
||||
},
|
||||
{
|
||||
"en": "Suit Up",
|
||||
"zh_cn": "整装上阵"
|
||||
},
|
||||
{
|
||||
"en": "Hot Stuff",
|
||||
"zh_cn": "热腾腾的"
|
||||
},
|
||||
{
|
||||
"en": "Isn't It Iron Pick",
|
||||
"zh_cn": "这不是铁镐么"
|
||||
},
|
||||
{
|
||||
"en": "Not Today, Thank You",
|
||||
"zh_cn": "不吃这套,谢谢"
|
||||
},
|
||||
{
|
||||
"en": "Ice Bucket Challenge",
|
||||
"zh_cn": "冰桶挑战"
|
||||
},
|
||||
{
|
||||
"en": "Diamonds!",
|
||||
"zh_cn": "钻石!"
|
||||
},
|
||||
{
|
||||
"en": "We Need to Go Deeper",
|
||||
"zh_cn": "勇往直下"
|
||||
},
|
||||
{
|
||||
"en": "Cover Me With Diamonds",
|
||||
"zh_cn": "钻石护体"
|
||||
},
|
||||
{
|
||||
"en": "Enchanter",
|
||||
"zh_cn": "附魔师"
|
||||
},
|
||||
{
|
||||
"en": "Zombie Doctor",
|
||||
"zh_cn": "僵尸科医生"
|
||||
},
|
||||
{
|
||||
"en": "Eye Spy",
|
||||
"zh_cn": "隔墙有眼"
|
||||
},
|
||||
{
|
||||
"en": "The End?",
|
||||
"zh_cn": "结束了?"
|
||||
},
|
||||
{
|
||||
"en": "Nether",
|
||||
"zh_cn": "下界"
|
||||
},
|
||||
{
|
||||
"en": "Return to Sender",
|
||||
"zh_cn": "见鬼去吧"
|
||||
},
|
||||
{
|
||||
"en": "Those Were the Days",
|
||||
"zh_cn": "光辉岁月"
|
||||
},
|
||||
{
|
||||
"en": "Hidden in the Depths",
|
||||
"zh_cn": "深藏不露"
|
||||
},
|
||||
{
|
||||
"en": "Subspace Bubble",
|
||||
"zh_cn": "曲速泡"
|
||||
},
|
||||
{
|
||||
"en": "A Terrible Fortress",
|
||||
"zh_cn": "阴森的要塞"
|
||||
},
|
||||
{
|
||||
"en": "Who is Cutting Onions?",
|
||||
"zh_cn": "谁在切洋葱?"
|
||||
},
|
||||
{
|
||||
"en": "Oh Shiny",
|
||||
"zh_cn": "金光闪闪"
|
||||
},
|
||||
{
|
||||
"en": "This Boat Has Legs",
|
||||
"zh_cn": "画船添足"
|
||||
},
|
||||
{
|
||||
"en": "Uneasy Alliance",
|
||||
"zh_cn": "脆弱的同盟"
|
||||
},
|
||||
{
|
||||
"en": "War Pigs",
|
||||
"zh_cn": "战猪"
|
||||
},
|
||||
{
|
||||
"en": "Country Lode, Take Me Home",
|
||||
"zh_cn": "天涯共此石"
|
||||
},
|
||||
{
|
||||
"en": "Cover Me in Debris",
|
||||
"zh_cn": "残骸裹身"
|
||||
},
|
||||
{
|
||||
"en": "Spooky Scary Skeleton",
|
||||
"zh_cn": "惊悚恐怖骷髅头"
|
||||
},
|
||||
{
|
||||
"en": "Into Fire",
|
||||
"zh_cn": "与火共舞"
|
||||
},
|
||||
{
|
||||
"en": "Not Quite \"Nine\" Lives",
|
||||
"zh_cn": "锚没有九条命"
|
||||
},
|
||||
{
|
||||
"en": "Hot Tourist Destinations",
|
||||
"zh_cn": "热门景点"
|
||||
},
|
||||
{
|
||||
"en": "Withering Heights",
|
||||
"zh_cn": "凋零山庄"
|
||||
},
|
||||
{
|
||||
"en": "Local Brewery",
|
||||
"zh_cn": "本地酿造厂"
|
||||
},
|
||||
{
|
||||
"en": "Bring Home the Beacon",
|
||||
"zh_cn": "带信标回家"
|
||||
},
|
||||
{
|
||||
"en": "A Furious Cocktail",
|
||||
"zh_cn": "狂乱的鸡尾酒"
|
||||
},
|
||||
{
|
||||
"en": "Beaconator",
|
||||
"zh_cn": "信标工程师"
|
||||
},
|
||||
{
|
||||
"en": "How Did We Get Here?",
|
||||
"zh_cn": "为什么会变成这样呢?"
|
||||
},
|
||||
{
|
||||
"en": "The End",
|
||||
"zh_cn": "末地"
|
||||
},
|
||||
{
|
||||
"en": "Free the End",
|
||||
"zh_cn": "解放末地"
|
||||
},
|
||||
{
|
||||
"en": "The Next Generation",
|
||||
"zh_cn": "下一世代"
|
||||
},
|
||||
{
|
||||
"en": "Remote Getaway",
|
||||
"zh_cn": "远程折跃"
|
||||
},
|
||||
{
|
||||
"en": "The End... Again...",
|
||||
"zh_cn": "结束了…再一次…"
|
||||
},
|
||||
{
|
||||
"en": "You Need a Mint",
|
||||
"zh_cn": "你需要来点薄荷糖"
|
||||
},
|
||||
{
|
||||
"en": "The City at the End of the Game",
|
||||
"zh_cn": "在游戏尽头的城市"
|
||||
},
|
||||
{
|
||||
"en": "Sky's the Limit",
|
||||
"zh_cn": "天空即为极限"
|
||||
},
|
||||
{
|
||||
"en": "Great View From Up Here",
|
||||
"zh_cn": "这上面的风景不错"
|
||||
},
|
||||
{
|
||||
"en": "Adventure",
|
||||
"zh_cn": "冒险"
|
||||
},
|
||||
{
|
||||
"en": "Voluntary Exile",
|
||||
"zh_cn": "自我放逐"
|
||||
},
|
||||
{
|
||||
"en": "Is It a Bird?",
|
||||
"zh_cn": "那是鸟吗?"
|
||||
},
|
||||
{
|
||||
"en": "Monster Hunter",
|
||||
"zh_cn": "怪物猎人"
|
||||
},
|
||||
{
|
||||
"en": "What a Deal!",
|
||||
"zh_cn": "成交!"
|
||||
},
|
||||
{
|
||||
"en": "Sticky Situation",
|
||||
"zh_cn": "胶着状态"
|
||||
},
|
||||
{
|
||||
"en": "Ol' Betsy",
|
||||
"zh_cn": "扣下悬刀"
|
||||
},
|
||||
{
|
||||
"en": "Surge Protector",
|
||||
"zh_cn": "电涌保护器"
|
||||
},
|
||||
{
|
||||
"en": "Sweet dreams",
|
||||
"zh_cn": "甜蜜的梦"
|
||||
},
|
||||
{
|
||||
"en": "Hero of the Village",
|
||||
"zh_cn": "村庄英雄"
|
||||
},
|
||||
{
|
||||
"en": "Is It a Balloon?",
|
||||
"zh_cn": "那是气球吗?"
|
||||
},
|
||||
{
|
||||
"en": "Throwaway Joke",
|
||||
"zh_cn": "抖包袱"
|
||||
},
|
||||
{
|
||||
"en": "Take Aim",
|
||||
"zh_cn": "瞄准目标"
|
||||
},
|
||||
{
|
||||
"en": "Monsters Hunted",
|
||||
"zh_cn": "资深怪物猎人"
|
||||
},
|
||||
{
|
||||
"en": "Postmortal",
|
||||
"zh_cn": "超越生死"
|
||||
},
|
||||
{
|
||||
"en": "Hired Help",
|
||||
"zh_cn": "招募援兵"
|
||||
},
|
||||
{
|
||||
"en": "Two Birds, One Arrow",
|
||||
"zh_cn": "一箭双雕"
|
||||
},
|
||||
{
|
||||
"en": "Who's the Pillager Now?",
|
||||
"zh_cn": "现在谁才是掠夺者?"
|
||||
},
|
||||
{
|
||||
"en": "Arbalistic",
|
||||
"zh_cn": "劲弩手"
|
||||
},
|
||||
{
|
||||
"en": "Adventuring Time",
|
||||
"zh_cn": "探索的时光"
|
||||
},
|
||||
{
|
||||
"en": "Is It a Plane?",
|
||||
"zh_cn": "那是飞机吗?"
|
||||
},
|
||||
{
|
||||
"en": "Very Very Frightening",
|
||||
"zh_cn": "魔女审判"
|
||||
},
|
||||
{
|
||||
"en": "Sniper Duel",
|
||||
"zh_cn": "狙击手的对决"
|
||||
},
|
||||
{
|
||||
"en": "Bullseye",
|
||||
"zh_cn": "正中靶心"
|
||||
},
|
||||
{
|
||||
"en": "Husbandry",
|
||||
"zh_cn": "农牧业"
|
||||
},
|
||||
{
|
||||
"en": "Bee Our Guest",
|
||||
"zh_cn": "与蜂共舞"
|
||||
},
|
||||
{
|
||||
"en": "The Parrots and the Bats",
|
||||
"zh_cn": "我从哪儿来?"
|
||||
},
|
||||
{
|
||||
"en": "Whatever Floats Your Goat!",
|
||||
"zh_cn": "羊帆起航!"
|
||||
},
|
||||
{
|
||||
"en": "Best Friends Forever",
|
||||
"zh_cn": "永恒的伙伴"
|
||||
},
|
||||
{
|
||||
"en": "Glow and Behold!",
|
||||
"zh_cn": "眼前一亮!"
|
||||
},
|
||||
{
|
||||
"en": "Fishy Business",
|
||||
"zh_cn": "腥味十足的生意"
|
||||
},
|
||||
{
|
||||
"en": "Total Beelocation",
|
||||
"zh_cn": "举巢搬迁"
|
||||
},
|
||||
{
|
||||
"en": "A Seedy Place",
|
||||
"zh_cn": "开荒垦地"
|
||||
},
|
||||
{
|
||||
"en": "Wax On",
|
||||
"zh_cn": "涂蜡"
|
||||
},
|
||||
{
|
||||
"en": "Two by Two",
|
||||
"zh_cn": "成双成对"
|
||||
},
|
||||
{
|
||||
"en": "A Complete Catalogue",
|
||||
"zh_cn": "百猫全书"
|
||||
},
|
||||
{
|
||||
"en": "Tactical fishing",
|
||||
"zh_cn": "战术性钓鱼"
|
||||
},
|
||||
{
|
||||
"en": "A Balanced Diet",
|
||||
"zh_cn": "均衡饮食"
|
||||
},
|
||||
{
|
||||
"en": "Serious Dedication",
|
||||
"zh_cn": "终极奉献"
|
||||
},
|
||||
{
|
||||
"en": "Wax Off",
|
||||
"zh_cn": "脱蜡"
|
||||
},
|
||||
{
|
||||
"en": "The Cutest Predator",
|
||||
"zh_cn": "最萌捕食者"
|
||||
},
|
||||
{
|
||||
"en": "The Healing Power of Friendship!",
|
||||
"zh_cn": "友谊的治愈力!"
|
||||
}
|
||||
]
|
||||
1
data/bind_qq.json
Normal file
1
data/bind_qq.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
||||
1
data/invitation.json
Normal file
1
data/invitation.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
||||
22
pyproject.toml
Normal file
22
pyproject.toml
Normal file
@ -0,0 +1,22 @@
|
||||
[tool.poetry]
|
||||
name = "AkashicQQ"
|
||||
version = "0.1.0"
|
||||
description = "AkashicQQ"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.7"
|
||||
nonebot2 = "^2.0.0.a1"
|
||||
nb-cli = "^0.1.0"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
nonebot-test = "^0.1.0"
|
||||
|
||||
[nonebot.plugins]
|
||||
plugins = ["nonebot_plugin_apscheduler"]
|
||||
plugin_dirs = ["src/plugins"]
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry>=0.12"]
|
||||
build-backend = "poetry.masonry.api"
|
||||
74
src/plugins/bilibililive_checker/__init__.py
Normal file
74
src/plugins/bilibililive_checker/__init__.py
Normal file
@ -0,0 +1,74 @@
|
||||
import json
|
||||
import asyncio
|
||||
|
||||
import nonebot
|
||||
from nonebot.log import logger
|
||||
from nonebot import require
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment
|
||||
import httpx
|
||||
|
||||
|
||||
config = json.loads(open('./config/bilibililive_checker.json', 'r').read())
|
||||
text: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['bilibililive_checker']['message']
|
||||
|
||||
live_status = [False for i in range(len(config['liveroom']))]
|
||||
|
||||
scheduler = require("nonebot_plugin_apscheduler").scheduler
|
||||
|
||||
|
||||
@scheduler.scheduled_job("cron", second="*/5")
|
||||
async def bilibili_checker_handler():
|
||||
if config['enable'] == False:
|
||||
return
|
||||
|
||||
post_data = {
|
||||
'uids': config['liveroom']
|
||||
}
|
||||
|
||||
async with httpx.AsyncClient() as client:
|
||||
res = await client.post(url='https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids', json=post_data)
|
||||
res = res.json()
|
||||
|
||||
if res['code'] != 0:
|
||||
return
|
||||
|
||||
for i in range(len(config['liveroom'])):
|
||||
if res['data'][str(config['liveroom'][i])]['live_status'] == 1:
|
||||
logger.debug(f"uid为{config['liveroom'][i]}的主播正在直播!")
|
||||
|
||||
if live_status[i] == False:
|
||||
|
||||
live_status[i] = True
|
||||
|
||||
at_msg = MessageSegment.at('all') + ''
|
||||
|
||||
msg = text.replace('<name>', res['data'][str(config['liveroom'][i])]['uname']).replace(
|
||||
'<title>', res['data'][str(config['liveroom'][i])]['title']).replace(
|
||||
'<area>', res['data'][str(config['liveroom'][i])]['area_v2_name']).replace(
|
||||
'<url>', f"https://live.bilibili.com/{res['data'][str(config['liveroom'][i])]['room_id']}") + \
|
||||
MessageSegment.image(
|
||||
res['data'][str(config['liveroom'][i])]['cover_from_user'])
|
||||
|
||||
# 获取机器人
|
||||
while True:
|
||||
try:
|
||||
bot: Bot = nonebot.get_bot()
|
||||
except ValueError:
|
||||
asyncio.sleep(0)
|
||||
else:
|
||||
break
|
||||
|
||||
for group_id in config['group']:
|
||||
# 单独发送 @全体成员,防止次数耗尽导致完全收不到消息
|
||||
await bot.send_group_msg(group_id=group_id, message=at_msg)
|
||||
await bot.send_group_msg(group_id=group_id, message=msg)
|
||||
|
||||
logger.info(
|
||||
f"uid为{config['liveroom'][i]}的主播正在直播,发送消息到群{config['group']}")
|
||||
|
||||
else:
|
||||
logger.debug(f"uid为{config['liveroom'][i]}的主播未在直播!")
|
||||
|
||||
if live_status[i] == True:
|
||||
live_status[i] = False
|
||||
75
src/plugins/bind_qq/__init__.py
Normal file
75
src/plugins/bind_qq/__init__.py
Normal file
@ -0,0 +1,75 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import utils
|
||||
import prism_api
|
||||
|
||||
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['bind_qq']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['bind_qq']
|
||||
bind_qq = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@bind_qq.handle()
|
||||
async def handle_bind_qq(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 发送者要绑定的玩家
|
||||
player_to_bind = str(event.message).strip()
|
||||
|
||||
# 检测格式
|
||||
if player_to_bind == '':
|
||||
await bind_qq.send(at_msg + text['format_error'])
|
||||
logger.info(f"{user_id}发送格式错误!绑定请求被拒绝")
|
||||
return
|
||||
|
||||
logger.info(f"{user_id}尝试绑定{player_to_bind}")
|
||||
|
||||
# 检测是否绑定过
|
||||
try:
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
record = {}
|
||||
|
||||
if str(user_id) in record:
|
||||
await bind_qq.send(at_msg + text['already_bind'])
|
||||
logger.debug(f"bind_qq表:{record}")
|
||||
logger.info(f"{user_id}已绑定过!绑定请求被拒绝")
|
||||
return
|
||||
|
||||
# 获取所有登录过的玩家列表,用于检测 ID 是否真实存在
|
||||
res = []
|
||||
|
||||
# 获取所有服务器的 usercache 表
|
||||
for server in prism_api.config['server']:
|
||||
prism_res = await prism_api.get(api='/usercache', server_tag=server['tag'])
|
||||
res += prism_res['data']['usercache']
|
||||
|
||||
players = []
|
||||
|
||||
for player in res:
|
||||
players.append(player['name'])
|
||||
|
||||
# ID 不存在
|
||||
if player_to_bind not in players:
|
||||
await bind_qq.send(at_msg + text['player_not_exist'])
|
||||
logger.debug(f"usercache表:{res}")
|
||||
logger.info(f"{user_id}要绑定的玩家不存在!绑定请求被拒绝")
|
||||
return
|
||||
|
||||
record[str(user_id)] = player_to_bind
|
||||
|
||||
with open('./data/bind_qq.json', 'w') as fp:
|
||||
fp.write(json.dumps(record))
|
||||
fp.close()
|
||||
|
||||
await bind_qq.send(at_msg + text['success'])
|
||||
|
||||
# 通知管理员
|
||||
await utils.inform_admin(message='绑定了游戏账号:' + player_to_bind, member_user_id=user_id)
|
||||
66
src/plugins/call_admin/__init__.py
Normal file
66
src/plugins/call_admin/__init__.py
Normal file
@ -0,0 +1,66 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import utils
|
||||
import prism_api
|
||||
|
||||
|
||||
not_bind_when_send_msg: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['bind_qq']['not_bind_when_send_msg']
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['call_admin']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['call_admin']
|
||||
call_admin = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@call_admin.handle()
|
||||
async def handle_call_admin(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 内容
|
||||
msg_to_send = str(event.message).strip()
|
||||
|
||||
# 检测格式
|
||||
if msg_to_send == '':
|
||||
await call_admin.send(at_msg + text['format_error'])
|
||||
logger.info(f"{user_id}发送格式错误!呼叫管理员请求被拒绝")
|
||||
return
|
||||
|
||||
logger.info(f"{user_id}尝试呼叫管理员:{msg_to_send}")
|
||||
|
||||
# 检查发送者是否绑定账号
|
||||
try:
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
record = {}
|
||||
|
||||
if str(user_id) not in record:
|
||||
logger.info(f"{user_id}试图向管理员发送消息但未绑定账号,已拒绝")
|
||||
await call_admin.send(at_msg + not_bind_when_send_msg)
|
||||
return
|
||||
|
||||
# 在 QQ 中通知管理员
|
||||
await utils.inform_admin(message='向管理员发送消息:' + msg_to_send, member_user_id=user_id)
|
||||
|
||||
# 获取群昵称
|
||||
res = await bot.get_group_member_info(group_id=utils.config['main_group'], user_id=user_id)
|
||||
|
||||
if 'card' not in res:
|
||||
user_card = res['nickname']
|
||||
else:
|
||||
user_card = res['card']
|
||||
|
||||
# 尝试在游戏内通知管理员
|
||||
for admin_user_id in utils.config['admin_user']:
|
||||
if str(admin_user_id) in record:
|
||||
prism_data = {
|
||||
'message': f"§5[QQ] §f{user_card} 向管理员发送消息:" + msg_to_send,
|
||||
'selector': record[str(admin_user_id)]
|
||||
}
|
||||
|
||||
await prism_api.all_server_tellraw(data=prism_data)
|
||||
57
src/plugins/cmd_register/__init__.py
Normal file
57
src/plugins/cmd_register/__init__.py
Normal file
@ -0,0 +1,57 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.typing import T_State
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import utils
|
||||
import prism_api
|
||||
|
||||
|
||||
config: list = json.loads(open('./config/cmd_register.json', 'r').read())
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['cmd_register']
|
||||
|
||||
cmd_list: list = [one_cmd['cmd'] for one_cmd in config]
|
||||
|
||||
for one_cmd in config:
|
||||
cmd_list += one_cmd['aliases']
|
||||
|
||||
cmd_register = on_command('cmd_register', aliases=set(cmd_list))
|
||||
|
||||
|
||||
@cmd_register.handle()
|
||||
async def handle_cmd_register(bot: Bot, event: MessageEvent, state: T_State):
|
||||
# 发送者 user_card
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
for cmd in config:
|
||||
cmd_and_aliases = [cmd['cmd']]
|
||||
cmd_and_aliases += cmd['aliases']
|
||||
|
||||
# 匹配到命令
|
||||
if state['_prefix']['command'][0] in cmd_and_aliases:
|
||||
logger.info(f"{user_id}试图执行命令:{cmd['cmd']}")
|
||||
|
||||
# 开始鉴权
|
||||
if cmd['permission'] == 'ALL' or \
|
||||
user_id in utils.config['op_user'] or \
|
||||
(cmd['permission'] == 'ADMIN' and user_id in utils.config['admin_user']) or \
|
||||
user_id in cmd['allow_member']:
|
||||
arg = str(event.message).strip()
|
||||
|
||||
if arg != '' and cmd['no_arg']:
|
||||
logger.info(f"{user_id}试图为不可添加参数的命令添加参数")
|
||||
await cmd_register.send(at_msg + text['extra_arg'])
|
||||
return
|
||||
|
||||
real_cmd = cmd['cmd'] + ' ' + arg
|
||||
|
||||
res = await prism_api.server_cmd(cmd=real_cmd, num=cmd['num'], wait_time=cmd['wait_time'], server_tag=cmd['server_tag'])
|
||||
msg = text['answer'].replace('<res>', res)
|
||||
await cmd_register.send(at_msg + msg)
|
||||
logger.info(f"命令执行结果:{res}")
|
||||
else:
|
||||
logger.info(f"{user_id}试图执行命令但无权限")
|
||||
await cmd_register.send(at_msg + text['no_permission'])
|
||||
87
src/plugins/get_invitation/__init__.py
Normal file
87
src/plugins/get_invitation/__init__.py
Normal file
@ -0,0 +1,87 @@
|
||||
import time
|
||||
import string
|
||||
import random
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
import aiomysql
|
||||
|
||||
import utils
|
||||
|
||||
|
||||
config: dict = json.loads(open('./config/get_invitation.json', 'r').read())
|
||||
text: dict = json.loads(
|
||||
open('./config/text.json', 'r').read())['get_invitation']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['get_invitation']
|
||||
get_invitation = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@get_invitation.handle()
|
||||
async def handle_get_invitation(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 鉴定发起者是否有剩余次数
|
||||
try:
|
||||
record = json.loads(open('./data/invitation.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
record = {}
|
||||
|
||||
# 不存在记录,设置为初始值
|
||||
if str(user_id) not in record:
|
||||
if user_id not in utils.config['admin_user']:
|
||||
record[str(user_id)] = config['initial_chance']
|
||||
else:
|
||||
record[str(user_id)] = 1
|
||||
|
||||
# 有剩余机会或请求者为管理员,则为其生成邀请码
|
||||
if record[str(user_id)] > 0 or user_id in utils.config['admin_user']:
|
||||
conn = await aiomysql.connect(
|
||||
host=config['blessing_skin_server_mysql']['host'],
|
||||
port=config['blessing_skin_server_mysql']['port'],
|
||||
user=config['blessing_skin_server_mysql']['user'],
|
||||
password=config['blessing_skin_server_mysql']['password'],
|
||||
db=config['blessing_skin_server_mysql']['db']
|
||||
)
|
||||
|
||||
cur = await conn.cursor()
|
||||
await cur.execute("SELECT id FROM invitation_codes")
|
||||
res = await cur.fetchall()
|
||||
|
||||
new_id = max(res)[0] + 1
|
||||
code = f"from{user_id}_" + \
|
||||
''.join(random.sample(string.ascii_letters + string.digits, 8))
|
||||
time_stamp = time.strftime(
|
||||
'%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
|
||||
|
||||
await cur.execute(
|
||||
"INSERT INTO `invitation_codes` (`id`, `code`, `generated_at`, `used_by`, `used_at`) " +
|
||||
f"VALUES ('{new_id}', '{code}', '{time_stamp}', '0', NULL)"
|
||||
)
|
||||
await conn.commit()
|
||||
conn.close()
|
||||
|
||||
msg = text['get_msg'].replace('<code>', code)
|
||||
await get_invitation.send(at_msg + msg)
|
||||
|
||||
# 非管理员,次数减一
|
||||
if user_id not in utils.config['admin_user']:
|
||||
record[str(user_id)] -= 1
|
||||
|
||||
with open('./data/invitation.json', 'w') as fp:
|
||||
fp.write(json.dumps(record))
|
||||
fp.close()
|
||||
|
||||
# 通知管理员
|
||||
await utils.inform_admin(message='索取了邀请码:' + code, member_user_id=user_id)
|
||||
|
||||
else:
|
||||
msg = text['no_chance']
|
||||
await get_invitation.send(at_msg + msg)
|
||||
|
||||
# 通知管理员
|
||||
await utils.inform_admin(message='试图索取邀请码,但邀请次数已耗尽', member_user_id=user_id)
|
||||
30
src/plugins/group_increase/__init__.py
Normal file
30
src/plugins/group_increase/__init__.py
Normal file
@ -0,0 +1,30 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_notice
|
||||
from nonebot.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, GroupIncreaseNoticeEvent
|
||||
|
||||
import utils
|
||||
|
||||
|
||||
welcome_msg: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['welcome']['message']
|
||||
|
||||
group_increase = on_notice()
|
||||
|
||||
|
||||
@group_increase.handle()
|
||||
async def handle_group_increase(bot: Bot, event: GroupIncreaseNoticeEvent):
|
||||
# 入群者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 发送入群欢迎消息
|
||||
await group_increase.send(at_msg + welcome_msg)
|
||||
logger.info(f"向{user_id}发送入群欢迎消息")
|
||||
logger.debug(f"欢迎消息:{welcome_msg}")
|
||||
|
||||
# 向管理员提示新增成员
|
||||
user_id = event.user_id
|
||||
group_id = event.group_id
|
||||
await utils.inform_admin(message='进入群' + str(group_id), member_user_id=user_id)
|
||||
26
src/plugins/help/__init__.py
Normal file
26
src/plugins/help/__init__.py
Normal file
@ -0,0 +1,26 @@
|
||||
import json
|
||||
from typing import Dict
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, Message, MessageEvent
|
||||
|
||||
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['help']
|
||||
help = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@help.handle()
|
||||
async def handle_help(bot: Bot, event: MessageEvent):
|
||||
logger.info('请求帮助')
|
||||
|
||||
msg = ''
|
||||
|
||||
for key in text:
|
||||
if type(text[key]) == type({}):
|
||||
if 'help' in text[key]:
|
||||
msg += text[key]['help'] + '\n'
|
||||
|
||||
await help.send(msg)
|
||||
75
src/plugins/issue_cmd/__init__.py
Normal file
75
src/plugins/issue_cmd/__init__.py
Normal file
@ -0,0 +1,75 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import prism_api
|
||||
|
||||
|
||||
op_user: list = json.loads(open('./config/group.json', 'r').read())['op_user']
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['issue_cmd']
|
||||
|
||||
cmd_set: dict = json.loads(
|
||||
open('./config/cmd_alias.json', 'r').read())['issue_cmd']
|
||||
issue_cmd = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@issue_cmd.handle()
|
||||
async def handle_issue_cmd(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
string = str(event.message).strip()
|
||||
arg_list = string.split(',')
|
||||
|
||||
logger.info(f"{user_id}试图执行命令:{arg_list}")
|
||||
|
||||
# 鉴权
|
||||
if user_id not in op_user:
|
||||
await issue_cmd.send(at_msg + text['no_permission'])
|
||||
logger.debug(f"op_user为:{op_user}")
|
||||
logger.info(f"{user_id}试图执行命令但无权限")
|
||||
return
|
||||
|
||||
# 处理命令格式,参数分别为 cmd num wait_time server_tag
|
||||
cmd = arg_list[0]
|
||||
|
||||
if cmd == '':
|
||||
await issue_cmd.send(at_msg + text['format_error'])
|
||||
logger.info(f"{user_id}发送格式错误!执行命令请求被拒绝")
|
||||
return
|
||||
|
||||
if len(arg_list) > 1:
|
||||
num = int(arg_list[1])
|
||||
else:
|
||||
num = 1
|
||||
|
||||
if len(arg_list) > 2:
|
||||
wait_time = int(arg_list[2])
|
||||
else:
|
||||
wait_time = 1
|
||||
|
||||
if len(arg_list) > 3:
|
||||
server = arg_list[3]
|
||||
|
||||
exist_server_tag_list = []
|
||||
for server in prism_api.config['server']:
|
||||
exist_server_tag_list.append(server['tag'])
|
||||
|
||||
if server not in exist_server_tag_list:
|
||||
await issue_cmd.send(at_msg + text['server_tag_not_exist'])
|
||||
logger.info("服务器不存在!执行命令请求被拒绝")
|
||||
return
|
||||
|
||||
else:
|
||||
server = None
|
||||
|
||||
# 发送命令
|
||||
res = await prism_api.server_cmd(cmd=cmd, num=num, wait_time=wait_time, server_tag=server)
|
||||
|
||||
# 回传结果
|
||||
msg = text['answer'].replace('<res>', res)
|
||||
await issue_cmd.send(at_msg + msg)
|
||||
logger.info(f"命令执行结果:{res}")
|
||||
192
src/plugins/mc_event/__init__.py
Normal file
192
src/plugins/mc_event/__init__.py
Normal file
@ -0,0 +1,192 @@
|
||||
import json
|
||||
import asyncio
|
||||
|
||||
import nonebot
|
||||
from nonebot.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot
|
||||
from fastapi import Body, FastAPI
|
||||
|
||||
import prism_api
|
||||
|
||||
|
||||
config: dict = json.loads(open('./config/mc_event.json', 'r').read())
|
||||
group_config: dict = json.loads(open('./config/group.json', 'r').read())
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['mc_event']
|
||||
not_bind_msg_in_game: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['bind_qq']['not_bind_msg_in_game']
|
||||
|
||||
|
||||
app: FastAPI = nonebot.get_app()
|
||||
|
||||
|
||||
@app.post('/')
|
||||
async def mc_event_handler(data: dict = Body(...)):
|
||||
data = data['data']
|
||||
logger.info(f"收到MC事件: {data}")
|
||||
|
||||
while True:
|
||||
try:
|
||||
bot: Bot = nonebot.get_bot()
|
||||
except ValueError:
|
||||
asyncio.sleep(0)
|
||||
else:
|
||||
break
|
||||
|
||||
# 处理事件
|
||||
if data['type'] == 'ServerStart':
|
||||
await server_start_handler(bot, data)
|
||||
elif data['type'] == 'ServerStop':
|
||||
await server_stop_handler(bot, data)
|
||||
elif data['type'] == 'PlayerJoin':
|
||||
await player_join_handler(bot, data)
|
||||
elif data['type'] == 'PlayerAdvancement':
|
||||
await player_advancement_handler(bot, data)
|
||||
elif data['type'] == 'PlayerChat':
|
||||
await player_chat_handler(bot, data)
|
||||
elif data['type'] == 'PlayerQuit':
|
||||
await player_quit_handler(bot, data)
|
||||
|
||||
return {
|
||||
"status": 200,
|
||||
"msg": "success"
|
||||
}
|
||||
|
||||
|
||||
async def server_start_handler(bot: Bot, data: dict):
|
||||
if config['enable']['server_start'] == False:
|
||||
return
|
||||
|
||||
message = text['server_start'].replace('<tag>', data['tag']).replace(
|
||||
'<time>', str(data['start_use_time']))
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
|
||||
async def server_stop_handler(bot: Bot, data: dict):
|
||||
if config['enable']['server_stop'] == False:
|
||||
return
|
||||
|
||||
message = text['server_stop'].replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
|
||||
async def player_join_handler(bot: Bot, data: dict):
|
||||
if config['enable']['player_join'] == False:
|
||||
return
|
||||
|
||||
message = text['player_join'].replace(
|
||||
'<player>', data['player']).replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
prism_data = {
|
||||
'message': f"§5[{data['tag']}] §f" + message,
|
||||
'selector': '@a'
|
||||
}
|
||||
|
||||
# 向其他服务器广播消息
|
||||
for server in prism_api.config['server']:
|
||||
if data['tag'] != server['tag']:
|
||||
await prism_api.post(api='/tellraw', data=prism_data, server_tag=server['tag'])
|
||||
|
||||
# 检测玩家是否绑定账号
|
||||
try:
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
players = list(record.values())
|
||||
except FileNotFoundError:
|
||||
players = []
|
||||
|
||||
# 玩家未绑定账号
|
||||
if data['player'] not in players:
|
||||
prism_data = {
|
||||
'message': not_bind_msg_in_game.replace('<player>', data['player']),
|
||||
'selector': data['player']
|
||||
}
|
||||
|
||||
await prism_api.post(api='/tellraw', data=prism_data, server_tag=data['tag'])
|
||||
logger.info(f"加入服务器{data['tag']}的玩家{data['player']}未绑定账号,已向其发送提示")
|
||||
|
||||
|
||||
async def player_advancement_handler(bot: Bot, data: dict):
|
||||
if config['enable']['player_advancement'] == False:
|
||||
return
|
||||
|
||||
# 检查成就翻译
|
||||
try:
|
||||
tranlation = json.loads(
|
||||
open('./data/advancement_translation.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
tranlation = {}
|
||||
|
||||
for adv in tranlation:
|
||||
if adv['en'].lower().strip() == data['advancement'].lower().strip():
|
||||
data['advancement'] = adv['zh_cn']
|
||||
break
|
||||
|
||||
message = text['player_advancement'].replace(
|
||||
'<player>', data['player']).replace('<advancement>', data['advancement']).replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
prism_data = {
|
||||
'message': f"§5[{data['tag']}] §f" + message,
|
||||
'selector': '@a'
|
||||
}
|
||||
|
||||
# 向其他服务器广播消息
|
||||
for server in prism_api.config['server']:
|
||||
if data['tag'] != server['tag']:
|
||||
await prism_api.post(api='/tellraw', data=prism_data, server_tag=server['tag'])
|
||||
|
||||
|
||||
async def player_chat_handler(bot: Bot, data: dict):
|
||||
if config['enable']['player_chat'] == False:
|
||||
return
|
||||
|
||||
message = text['player_chat'].replace(
|
||||
'<player>', data['player']).replace('<message>', data['message']).replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
prism_data = {
|
||||
'message': f"§5[{data['tag']}] §f" + message,
|
||||
'selector': '@a'
|
||||
}
|
||||
|
||||
# 向其他服务器广播消息
|
||||
for server in prism_api.config['server']:
|
||||
if data['tag'] != server['tag']:
|
||||
await prism_api.post(api='/tellraw', data=prism_data, server_tag=server['tag'])
|
||||
|
||||
|
||||
async def player_quit_handler(bot: Bot, data: dict):
|
||||
if config['enable']['player_quit'] == True:
|
||||
message = text['player_quit'].replace(
|
||||
'<player>', data['player']).replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_group_msg(group_id=group_config['main_group'], message=message)
|
||||
|
||||
prism_data = {
|
||||
'message': f"§5[{data['tag']}] §f" + message,
|
||||
'selector': '@a'
|
||||
}
|
||||
|
||||
# 向其他服务器广播消息
|
||||
for server in prism_api.config['server']:
|
||||
if data['tag'] != server['tag']:
|
||||
await prism_api.post(api='/tellraw', data=prism_data, server_tag=server['tag'])
|
||||
|
||||
if config['enable']['player_quit_private'] == True:
|
||||
# 向本人发送消息,提醒下线
|
||||
try:
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
record = {}
|
||||
|
||||
for key in record:
|
||||
if record[key] == data['player']:
|
||||
message = text['player_quit_private'].replace(
|
||||
'<player>', data['player']).replace('<tag>', data['tag'])
|
||||
|
||||
await bot.send_private_msg(user_id=int(key), message=message)
|
||||
73
src/plugins/prism_api/__init__.py
Normal file
73
src/plugins/prism_api/__init__.py
Normal file
@ -0,0 +1,73 @@
|
||||
import json
|
||||
import re
|
||||
|
||||
from nonebot.log import logger
|
||||
import httpx
|
||||
|
||||
|
||||
config = json.loads(open('./config/mc_server.json', 'r').read())
|
||||
|
||||
|
||||
async def get(api: str, server_tag: str = None):
|
||||
if server_tag == None:
|
||||
server_tag = config['main_server_tag']
|
||||
|
||||
for server in config['server']:
|
||||
if server['tag'] == server_tag:
|
||||
url = server['url']
|
||||
|
||||
async with httpx.AsyncClient() as client:
|
||||
logger.debug(f"发送prism_api.get:{url + api} server={server_tag}")
|
||||
resp = await client.get(url=url + api, timeout=10)
|
||||
resp = resp.json()
|
||||
logger.debug(f"prism_api.get回复:{resp}")
|
||||
return resp
|
||||
|
||||
|
||||
async def post(api: str, data: dict = [], server_tag: str = None):
|
||||
if server_tag == None:
|
||||
server_tag = config['main_server_tag']
|
||||
|
||||
for server in config['server']:
|
||||
if server['tag'] == server_tag:
|
||||
url = server['url']
|
||||
|
||||
async with httpx.AsyncClient() as client:
|
||||
logger.debug(
|
||||
f"发送prism_api.post:{url + api} data={data} server={server_tag}")
|
||||
resp = await client.post(url=url + api, json=data, timeout=10)
|
||||
resp = resp.json()
|
||||
logger.debug(f"prism_api.post回复:{resp}")
|
||||
return resp
|
||||
|
||||
|
||||
async def server_cmd(cmd: str, num: int = 1, wait_time: int = 1, server_tag: str = None):
|
||||
data = {
|
||||
'cmd': cmd,
|
||||
'num': num,
|
||||
'wait_time': wait_time
|
||||
}
|
||||
|
||||
logger.debug(f"发送prism_api.server_cmd:data={data} server={server_tag}")
|
||||
res = await post(api='/cmd', data=data, server_tag=server_tag)
|
||||
|
||||
if res['status'] == 200:
|
||||
res_str = ''
|
||||
for string in res['data']['list']:
|
||||
temp_list = re.findall("]: (.*?)$", string)
|
||||
|
||||
if temp_list:
|
||||
res_str += temp_list[0] + '\n'
|
||||
|
||||
logger.debug(f"prism_api.server_cmd回复:{res_str}")
|
||||
return res_str
|
||||
else:
|
||||
logger.debug(f"prism_api.server_cmd请求对应服务器未开启游戏,返回空值")
|
||||
return ''
|
||||
|
||||
|
||||
async def all_server_tellraw(data: dict = []):
|
||||
logger.debug(f"prism_api.all_server_tellraw data={data}")
|
||||
async with httpx.AsyncClient() as client:
|
||||
for server in config['server']:
|
||||
await client.post(url=server['url'] + '/tellraw', json=data, timeout=10)
|
||||
37
src/plugins/query_online/__init__.py
Normal file
37
src/plugins/query_online/__init__.py
Normal file
@ -0,0 +1,37 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import prism_api
|
||||
|
||||
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['query_online']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['query_online']
|
||||
query_online = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@query_online.handle()
|
||||
async def handle_query_online(bot: Bot, event: MessageEvent):
|
||||
for server in prism_api.config['server']:
|
||||
res = await prism_api.get(api='/list', server_tag=server['tag'])
|
||||
tag = res['data']['tag']
|
||||
res = res['data']['player_list']
|
||||
|
||||
num = len(res)
|
||||
if num == 0:
|
||||
msg = text['no_player'].replace('<tag>', tag)
|
||||
else:
|
||||
player_list = ''
|
||||
for i in range(num):
|
||||
if i == 0:
|
||||
player_list += res[i]
|
||||
else:
|
||||
player_list += ', ' + res[i]
|
||||
msg = text['list_player'].replace(
|
||||
'<num>', str(num)).replace('<list>', player_list).replace('<tag>', tag)
|
||||
|
||||
logger.info(f"查询在线人数:{tag} {res}")
|
||||
await query_online.send(msg)
|
||||
51
src/plugins/say_mc_msg/__init__.py
Normal file
51
src/plugins/say_mc_msg/__init__.py
Normal file
@ -0,0 +1,51 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import prism_api
|
||||
|
||||
|
||||
not_bind_when_send_msg: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['bind_qq']['not_bind_when_send_msg']
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['say_mc_msg']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['say_mc_msg']
|
||||
say_mc_msg = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@say_mc_msg.handle()
|
||||
async def handle_say_mc_msg(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_id
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 检查发送者是否绑定账号
|
||||
try:
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
except FileNotFoundError:
|
||||
record = {}
|
||||
|
||||
if str(user_id) not in record:
|
||||
logger.info(f"{user_id}试图向服务器发送消息但未绑定账号,已拒绝")
|
||||
await say_mc_msg.send(at_msg + not_bind_when_send_msg)
|
||||
return
|
||||
|
||||
user_card = record[str(user_id)]
|
||||
|
||||
# 发送消息
|
||||
msg_to_send = str(event.message).strip()
|
||||
|
||||
if msg_to_send == '':
|
||||
logger.info(f"{user_id}发送格式错误!发送消息请求被拒绝")
|
||||
await say_mc_msg.send(at_msg + text['format_error'])
|
||||
return
|
||||
|
||||
data = {
|
||||
'message': text['msg_in_game'].replace('<bind_player>', user_card).replace('<msg>', msg_to_send),
|
||||
'selector': '@a'
|
||||
}
|
||||
|
||||
await prism_api.all_server_tellraw(data=data)
|
||||
logger.info(f"{user_id}向服务器发送消息:{msg_to_send}")
|
||||
52
src/plugins/tell_mc_msg/__init__.py
Normal file
52
src/plugins/tell_mc_msg/__init__.py
Normal file
@ -0,0 +1,52 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageSegment, MessageEvent
|
||||
|
||||
import prism_api
|
||||
|
||||
|
||||
not_bind_when_send_msg: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['bind_qq']['not_bind_when_send_msg']
|
||||
text: dict = json.loads(open('./config/text.json', 'r').read())['tell_mc_msg']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['tell_mc_msg']
|
||||
tell_mc_msg = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@tell_mc_msg.handle()
|
||||
async def handle_tell_mc_msg(bot: Bot, event: MessageEvent):
|
||||
# 发送者 user_card
|
||||
user_id = event.user_id
|
||||
at_msg = MessageSegment.at(user_id) + '\n'
|
||||
|
||||
# 检查发送者是否绑定账号
|
||||
record = json.loads(open('./data/bind_qq.json', 'r').read())
|
||||
|
||||
if str(user_id) not in record:
|
||||
logger.info(f"{user_id}试图向服务器私聊消息但未绑定账号,已拒绝")
|
||||
await tell_mc_msg.send(at_msg + not_bind_when_send_msg)
|
||||
return
|
||||
|
||||
user_card = record[str(user_id)]
|
||||
|
||||
# 发送消息
|
||||
stripped_arg = str(event.message).strip()
|
||||
|
||||
index = stripped_arg.find(' ')
|
||||
player_id = stripped_arg[0:index]
|
||||
msg_to_send = (stripped_arg[index + 1:len(stripped_arg)])
|
||||
|
||||
if player_id == '' or msg_to_send == '' or index == -1:
|
||||
logger.info(f"{user_id}发送格式错误!私聊消息请求被拒绝")
|
||||
await tell_mc_msg.send(at_msg + text['format_error'])
|
||||
return
|
||||
|
||||
data = {
|
||||
'message': text['msg_in_game'].replace('<bind_player>', user_card).replace('<msg>', msg_to_send),
|
||||
'selector': player_id
|
||||
}
|
||||
|
||||
await prism_api.all_server_tellraw(data=data)
|
||||
logger.info(f"{user_id}向{player_id}私聊消息:{msg_to_send}")
|
||||
40
src/plugins/utils/__init__.py
Normal file
40
src/plugins/utils/__init__.py
Normal file
@ -0,0 +1,40 @@
|
||||
import json
|
||||
import asyncio
|
||||
|
||||
import nonebot
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot
|
||||
|
||||
|
||||
config = json.loads(open('./config/group.json', 'r').read())
|
||||
|
||||
|
||||
async def inform_admin(message: str, member_user_id: int = None):
|
||||
while True:
|
||||
try:
|
||||
bot: Bot = nonebot.get_bot()
|
||||
except ValueError:
|
||||
asyncio.sleep(0)
|
||||
else:
|
||||
break
|
||||
|
||||
# 指定 member_user_id
|
||||
if member_user_id != None:
|
||||
# 获取 member 群昵称
|
||||
res = await bot.get_group_member_info(group_id=config['main_group'], user_id=member_user_id)
|
||||
|
||||
if 'card' not in res:
|
||||
user_card = res['nickname']
|
||||
else:
|
||||
user_card = res['card']
|
||||
|
||||
for i in range(len(config['admin_user'])):
|
||||
await bot.send_private_msg(user_id=config['admin_user'][i], message=f"{user_card}({member_user_id}){message}")
|
||||
|
||||
logger.info(f"{user_card}({member_user_id}){message}")
|
||||
|
||||
else:
|
||||
for i in range(len(config['admin_user'])):
|
||||
await bot.send_private_msg(user_id=config['admin_user'][i], message=message)
|
||||
|
||||
logger.info(message)
|
||||
28
src/plugins/welcome/__init__.py
Normal file
28
src/plugins/welcome/__init__.py
Normal file
@ -0,0 +1,28 @@
|
||||
import json
|
||||
|
||||
from nonebot import on_command
|
||||
from nonebot import logger
|
||||
from nonebot.adapters.cqhttp import Bot, Message, MessageEvent
|
||||
|
||||
|
||||
welcome_msg: str = json.loads(
|
||||
open('./config/text.json', 'r').read())['welcome']['message']
|
||||
|
||||
cmd_set: dict = json.loads(open('./config/cmd_alias.json', 'r').read())['welcome']
|
||||
welcome = on_command(cmd_set['cmd'], aliases=set(cmd_set['aliases']))
|
||||
|
||||
|
||||
@welcome.handle()
|
||||
async def handle_welcome(bot: Bot, event: MessageEvent):
|
||||
arg = str(event.message).strip()
|
||||
|
||||
if not arg: # 用户未发送参数
|
||||
at_msg = ''
|
||||
|
||||
else: # 用户发送参数
|
||||
at_msg = Message(arg + '\n')
|
||||
|
||||
logger.info('发送欢迎消息')
|
||||
logger.debug(f"欢迎消息:{welcome_msg}")
|
||||
|
||||
await welcome.send(at_msg + welcome_msg)
|
||||
Loading…
x
Reference in New Issue
Block a user