Skip to content

Commit

Permalink
Merge pull request #72 from Ice-Cirno/dev
Browse files Browse the repository at this point in the history
new feature: damage stat
  • Loading branch information
Ice9Coffee authored May 12, 2020
2 parents 4c9a3b9 + ec79414 commit 835e9a8
Show file tree
Hide file tree
Showing 13 changed files with 177 additions and 52 deletions.
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ HoshinoBot 的功能繁多,各群可根据自己的需要进行开关控制,
>
>若安装python依赖库时下载速度缓慢,可以尝试使用`py -3.8 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt`

6. 回到资源管理器,复制`config_sample.py`至同目录下,重命名为`config.py`,右键使用Notepad++打开,按照其中的注释说明进行编辑。
6. 回到资源管理器,复制`config.example.py`至同目录下,重命名为`config.py`,右键使用Notepad++打开,按照其中的注释说明进行编辑。

> 如果您不清楚某项设置的作用,请保持默认

Expand Down Expand Up @@ -157,8 +157,10 @@ HoshinoBot 的功能繁多,各群可根据自己的需要进行开关控制,
richardchien/cqhttp:latest
```

> 然后访问 `http://<你的IP>:9000/` 进入 noVNC(默认密码 `MAXchar8`),登录 酷Q,即可开始使用
> 使用这行命令`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`查看你的docker桥ip,替换`CQHTTP_WS_REVERSE_URL`中的链接
>
> 然后访问 `http://<你的IP>:9000/` 进入 noVNC(默认密码 `MAXchar8`),登录 酷Q
>
> 注:如果你希望先使用酷Q Air进行尝试,请将COOLQ_URL设置为`https://dlsec.cqp.me/cqa-xiaoi`;之后可以用CQP.exe替换CQA.exe以升级,或删除容器重新创建。

3. 回到我们熟悉的命令行,安装 Python 3.8
Expand All @@ -171,22 +173,22 @@ HoshinoBot 的功能繁多,各群可根据自己的需要进行开关控制,
>
> Google will help you greatly : )

1. 克隆本仓库并安装依赖包
4. 克隆本仓库并安装依赖包
```bash
git clone https://github.com/Ice-Cirno/HoshinoBot.git
cd HoshinoBot
python3.8 -m pip install -r requirements.txt
```

2. 编辑配置文件
5. 编辑配置文件
```bash
cp config_sample.py config.py
cp config.example.py config.py
nano config.py
```
> 配置文件内有相应注释,请根据您的实际配置填写,HoshinoBot仅支持反向ws通信
>
> 您也可以使用`vim`编辑器,若您从未使用过,我推荐您使用 `nano` : )
3. 运行bot
6. 运行bot
```bash
python3.8 run.py
```
Expand Down
11 changes: 7 additions & 4 deletions config_sample.py → config.example.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@

# hoshino监听的端口与ip
PORT = 8080
HOST = '127.0.0.1' # Windows本地部署使用此条配置
# HOST = '172.17.0.1' # docker使用此条配置
# HOST = '172.18.0.1' # 阿里云服务器的docker使用此条配置
HOST = '127.0.0.1' # Windows部署使用此条配置
# HOST = '172.17.0.1' # linux + docker使用此条配置
# docker桥的ip可能随环境不同而有变化
# 使用这行命令`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`查看你的docker桥ip
# HOST = '172.18.0.1' # 阿里云的linux + docker多数情况是这样
# HOST = '0.0.0.0' # 开放公网访问使用此条配置(不安全)

IS_CQPRO = False # 是否使用Pro版酷Q功能

Expand All @@ -24,6 +27,7 @@

# 资源库 URL 用于docker中的酷Q读取宿主机资源,注意以'/'结尾
# 若留空则图片均采用base64编码发送,开销较大但部署方便
# 若不清楚本项作用,请保持默认
RESOURCE_URL = ''

# 启用的模块
Expand All @@ -32,7 +36,6 @@
# 切忌一次性开启多个
MODULES_ON = {
'botmanage',
# 'deepchat',
'dice',
'groupmaster',
# 'hourcall',
Expand Down
30 changes: 30 additions & 0 deletions hoshino/modules/groupmaster/group_approve.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from nonebot import on_request, RequestSession
from hoshino.util import load_config

''' Config Example
{
...,
"group_approve": {
"123456": {
"keywords": ["key1", "key2", "key3"],
"reject_when_not_match": true/false
}
}
}
'''

@on_request('group.add')
async def group_approve(session:RequestSession):
cfg = load_config(__file__)
cfg = cfg.get('group_approve', {})
gid = str(session.event.group_id)
if gid not in cfg:
return
key = cfg[gid].get('keywords', [])
for k in key:
if k in session.event.comment:
await session.approve()
return
if cfg[gid].get('reject_when_not_match', False):
await session.reject()
return
8 changes: 8 additions & 0 deletions hoshino/modules/groupmaster/group_notice.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ async def increace_notice(session:NoticeSession):
gid = str(session.ctx['group_id'])
if gid in welcome_dic:
await session.send(welcome_dic[gid], at_sender=True)


@on_notice('group_decrease.kick_me')
async def kick_me_alert(session:NoticeSession):
group_id = session.event.group_id
operator_id = session.event.operator_id
coffee = session.bot.config.SUPERUSERS[0]
await session.bot.send_private_msg(self_id=session.event.self_id, user_id=coffee, message=f'被Q{operator_id}踢出群{group_id}')
21 changes: 21 additions & 0 deletions hoshino/modules/pcrclanbattle/clanbattle/battlemaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,27 @@ def stat_challenge(self, cid, time, only_one_day=True, zone_num:int=8):
return ret


def stat_damage(self, cid, time):
'''
统计cid会各成员的本月各Boss伤害总量
:return: [(uid, alt, name, [total_dmg, dmg1, ..., dmg5])]
'''
clan = self.get_clan(cid)
if not clan:
raise NotFoundError(f'未找到公会{cid}')
server = clan['server']
stat = self.stat_challenge(cid, time, only_one_day=False, zone_num=self.get_timezone_num(server))
ret = []
for mem, challens in stat:
dmgs = [0] * 6
for ch in challens:
d = ch['dmg']
dmgs[0] += d
dmgs[ch['boss']] += d
ret.append((mem['uid'], mem['alt'], mem['name'], dmgs))
return ret


def stat_score(self, cid, time):
'''
统计cid会各成员的本月总分数
Expand Down
61 changes: 59 additions & 2 deletions hoshino/modules/pcrclanbattle/clanbattle/cmdv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -585,8 +585,65 @@ async def show_progress(bot:NoneBot, ctx:Context_T, args:ParseResult):
await bot.send(ctx, '\n' + msg, at_sender=True)


@cb_cmd('统计', ArgParser(usage='!统计'))
async def stat(bot:NoneBot, ctx:Context_T, args:ParseResult):
@cb_cmd('伤害统计', ArgParser(usage='!伤害统计'))
async def stat_damage(bot:NoneBot, ctx:Context_T, args:ParseResult):
bm = BattleMaster(ctx['group_id'])
now = datetime.now()
clan = _check_clan(bm)
yyyy, mm, _ = bm.get_yyyymmdd(now)
stat = bm.stat_damage(1, now)

yn = len(stat)
if not yn:
await bot.send(ctx, f"{clan['name']}{yyyy}{mm}月会战统计数据为空", at_sender=True)
return

stat.sort(key=lambda x: x[3][0], reverse=True)
name = [ s[2] for s in stat ]
y_pos = list(range(yn))
y_size = 0.3 * yn + 1.0
unit = 1e4
unit_str = 'w'

# convert to pre-sum
for s in stat:
d = s[3]
d[0] = 0
for i in range(2, 6):
d[i] += d[i - 1]
pre_sum_dmg = [
[ s[3][b] for s in stat ] for b in range(6)
]

# generate statistic figure
fig, ax = plt.subplots()
fig.set_size_inches(10, y_size)
ax.set_title(f"{clan['name']}{yyyy}{mm}月会战伤害统计")
ax.set_yticks(y_pos)
ax.set_yticklabels(name)
ax.set_ylim((-0.6, yn - 0.4))
ax.invert_yaxis()
ax.set_xlabel('伤害')
colors = ['#00a2e8', '#22b14c', '#b5e61d', '#fff200', '#ff7f27', '#ed1c24']
bars = [ ax.barh(y_pos, pre_sum_dmg[b], align='center', color=colors[b]) for b in range(5, -1, -1) ]
bars.reverse()
ax.ticklabel_format(axis='x', style='plain')
for b in range(1, 6):
for i, rect in enumerate(bars[b]):
x = (rect.get_width() + bars[b - 1][i].get_width()) / 2
y = rect.get_y() + rect.get_height() / 2
d = pre_sum_dmg[b][i] - pre_sum_dmg[b - 1][i]
if d > unit:
ax.text(x, y, f'{d/unit:.0f}{unit_str}', ha='center', va='center')
plt.subplots_adjust(left=0.12, right=0.96, top=1 - 0.35 / y_size, bottom=0.55 / y_size)
pic = util.fig2b64(plt)
plt.close()

await bot.send(ctx, ms.image(pic), at_sender=True)


@cb_cmd(('统计', '分数统计'), ArgParser(usage='!分数统计'))
async def stat_score(bot:NoneBot, ctx:Context_T, args:ParseResult):
bm = BattleMaster(ctx['group_id'])
now = datetime.now()
clan = _check_clan(bm)
Expand Down
30 changes: 16 additions & 14 deletions hoshino/modules/priconne/cherugo.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
import re
from itertools import zip_longest
from nonebot.message import escape
from hoshino import Service, CommandSession

sv = Service('pcr-cherugo')

"""切噜语转换
"""切噜语(ちぇる語, Language Cheru)转换
定义:
W_cheru = '切' ^ `CHERU_SET`+
Expand All @@ -15,11 +8,19 @@
切噜语由切噜词与标点符号连接而成
"""

import re
from itertools import zip_longest
from nonebot.message import escape
from hoshino import Service, CommandSession

sv = Service('pcr-cherugo')

CHERU_SET = '切卟叮咧哔唎啪啰啵嘭噜噼巴拉蹦铃'
CHERU_DIC = { c: i for i, c in enumerate(CHERU_SET) }
ENCODING = 'gb18030'
rex_split = re.compile(r'\b', re.U)
rex_word = re.compile(r'^\w+$', re.U)
rex_cheru_word:re.Pattern = re.compile(rf'切[{CHERU_SET}]+', re.U)

def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
Expand Down Expand Up @@ -51,12 +52,13 @@ def str2cheru(s:str) -> str:
return ''.join(c)

def cheru2str(c:str) -> str:
s = []
for w in rex_split.split(c):
if rex_word.search(w):
w = cheru2word(w)
s.append(w)
return ''.join(s)
return rex_cheru_word.sub(lambda w: cheru2word(w.group()), c)
# s = []
# for w in rex_split.split(c):
# if rex_word.search(w):
# w = cheru2word(w)
# s.append(w)
# return ''.join(s)

@sv.on_command('切噜一下')
async def cherulize(session:CommandSession):
Expand Down
23 changes: 12 additions & 11 deletions hoshino/modules/priconne/gacha/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@
"up_prob": 14,
"s3_prob": 50,
"s2_prob": 180,
"up": [ "凯留(新年)", "リン(レンジャー)" ],
"up": [ "凯留(新年)", "空花(大江户)", "妮诺(大江户)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","真步","璃乃","初音","","伊绪",
"咲恋","","妮诺","秋乃","镜华","","真琴",
"伊莉亚","","静流","莫妮卡","流夏","吉塔",
"亚里莎","","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"亚里莎","","古蕾娅",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿"
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿",
"リン(レンジャー)"
],
"other_normal_star3": [ ],
"other_normal_star3": [ "空花(大江户)", "妮诺(大江户)" ],
"star2": [
"茉莉","茜里","宫子","","七七香","美里",
"铃奈","香织","美美","绫音","","惠理子",
Expand All @@ -27,7 +28,7 @@
},
"TW": {
"up_prob": 7,
"s3_prob": 50,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "凯留(新年)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
Expand All @@ -37,8 +38,7 @@
"伊莉亚","","静流","莫妮卡","流夏","吉塔",
"亚里莎","","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)",
"克莉丝提娜", "矛依未", "似似花"
"伊莉亚(圣诞节)"
],
"other_normal_star3": [ "霞(魔法少女)", "优妮", "琪爱儿" ],
"star2": [
Expand All @@ -56,15 +56,16 @@
"up_prob": 7,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "リン(レンジャー)" ],
"up": [ "空花(大江户)", "妮诺(大江户)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","真步","璃乃","初音","","伊绪",
"咲恋","","妮诺","秋乃","镜华","","真琴",
"伊莉亚","","静流","莫妮卡","流夏","吉塔",
"亚里莎","","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"亚里莎","","古蕾娅",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿"
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿",
"リン(レンジャー)"
],
"other_normal_star3": [ ],
"star2": [
Expand All @@ -82,7 +83,7 @@
"up_prob": 7,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "", "真琴", "真步" ],
"up": [ "真琴", "真步" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","璃乃","初音","伊绪",
Expand Down
8 changes: 4 additions & 4 deletions hoshino/modules/priconne/news/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ async def news_poller(spider:BaseSpider, sv:Service, TAG):
sv.logger.info(f'检索到{len(news)}{TAG}新闻更新!')
await sv.broadcast(spider.format_items(news), TAG, interval_time=0.5)

@svtw.scheduled_job('cron', minute='*/20', jitter=20)
@svtw.scheduled_job('cron', minute='*/5', jitter=20)
async def sonet_news_poller():
await news_poller(SonetSpider, svtw, '台服官网')

@svbl.scheduled_job('cron', minute='*/20', jitter=20)
@svbl.scheduled_job('cron', minute='*/5', jitter=20)
async def bili_news_poller():
await news_poller(SonetSpider, svbl, 'B服官网')
await news_poller(BiliSpider, svbl, 'B服官网')


async def send_news(session, spider:BaseSpider, max_num=5):
Expand All @@ -36,6 +36,6 @@ async def send_news(session, spider:BaseSpider, max_num=5):
async def send_sonet_news(session):
await send_news(session, SonetSpider)

@svbl.on_command('B服新闻', aliases=('B服日程'))
@svbl.on_command('B服新闻', aliases=('b服新闻', 'B服日程', 'b服日程'))
async def send_bili_news(session):
await send_news(session, BiliSpider)
5 changes: 3 additions & 2 deletions hoshino/modules/priconne/priconne_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class _PriconneData:
1107: ["碧(插班生)", "アオイ(編入生)", "Aoi(Hennyuusei)", "生菜"],
1108: ["克萝依", "クロエ", "Kuroe", "华哥", "黑江"],
1109: ["琪爱儿", "チエル", "Chieru", "切露", "茄露", "茄噜", "切噜"],
1110: ["优妮", "ユニ", "Yuni", "u2", "优妮辈先", "辈先"],
1110: ["优妮", "ユニ", "Yuni", "u2", "优妮辈先", "辈先", "书记"],
1111: ["镜华(万圣节)", "キョウカ(ハロウィン)", "Kyouka(Halloween)", "万圣镜华", "万圣小仓唯", "万圣xcw", "猫仓唯", "黑猫仓唯", "mcw", "猫唯", "猫仓", "喵唯"],
1112: ["禊(万圣节)", "ミソギ(ハロウィン)", "Misogi(Halloween)", "万圣禊", "万圣炸弹人", "瓜炸弹人", "万圣炸弹", "万圣炸", "瓜炸", "南瓜炸", "🎃💣"],
1113: ["美美(万圣节)", "ミミ(ハロウィン)", "Mimi(Halloween)", "万圣兔", "万圣兔子", "万圣兔兔", "绷带兔", "绷带兔子", "万圣美美", "绷带美美", "万圣🐰", "绷带🐰", "🎃🐰", "万圣🐇", "绷带🐇", "🎃🐇"],
Expand Down Expand Up @@ -148,5 +148,6 @@ class _PriconneData:


# =================================== #
9401: ["爱梅斯", "アメス", "Amesu"],
9000: ["祐树", "ユウキ", "Yuuki", "祐樹", "骑士", "骑士君"],
# 9401: ["爱梅斯", "アメス", "Amesu"],
}
Loading

0 comments on commit 835e9a8

Please sign in to comment.