Skip to content

Commit

Permalink
Merge branch 'master' of github.com:zzbslayer/KokkoroBot-discord
Browse files Browse the repository at this point in the history
  • Loading branch information
zzbslayer committed Jul 9, 2021
2 parents a666ae3 + f335489 commit 22b1002
Show file tree
Hide file tree
Showing 25 changed files with 364 additions and 199 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
WORKDIR /bot
COPY requirements.txt /bot/requirements.txt
RUN pip install -r requirements.txt
RUN pip install https://github.com/jxtech/wechatpy/archive/master.zip
# RUN pip install https://github.com/jxtech/wechatpy/archive/master.zip
# RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

FROM develop AS release
Expand Down
10 changes: 9 additions & 1 deletion kokkoro/bot/tomon/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,12 @@ def get_groups(self) -> List[TomonGroup]:
@overrides(KokkoroBot)
def get_members_in_group(self, gid) -> List[TomonUser]:
raw_members = asyncio.run(self._bot.api().route(f'/guilds/{gid}/members').get())
return TomonUser.from_raw_members(raw_members)
return TomonUser.from_raw_members(raw_members)

def get_group_by_id(self, gid) -> TomonGroup:
raw_group = asyncio.run(self._bot.api().route(f'/guilds/{gid}').get())
return TomonGroup(raw_group)

def get_roles_by_group(self, gid):
raw_roles = asyncio.run(self._bot.api().route(f'/guilds/{gid}/roles').get())
return raw_roles
34 changes: 26 additions & 8 deletions kokkoro/bot/tomon/tomon_adaptor.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import asyncio
from kokkoro import config
from kokkoro.priv import SUPERUSER, ADMIN, NORMAL, OWNER

from kokkoro.bot.tomon import get_bot
from kokkoro.typing import List, overrides
from kokkoro.common_interface import EventInterface, UserInterface, GroupInterface, SupportedMessageType
from kokkoro.util import to_string

from . import get_bot
from .tomon_util import has_permission_for, calculate_permission

class TomonPriv:
ADMINISTRATOR = 1 << 3

'''
Raw User (dict)
https://developer.tomon.co/docs/guild#群组成员guild-member
Expand All @@ -15,7 +19,9 @@ class TomonUser(UserInterface):
def __init__(self, user, member={}):
self.raw_user = user
self.raw_member = member
# lazy loaded var
self.group = None
self.roles = None

@staticmethod
def from_raw_member(member):
Expand Down Expand Up @@ -46,9 +52,6 @@ def get_raw_user(self):
def get_nick_name(self):
return to_string(self.raw_member.get('nick')) or self.get_name()

def get_roles(self):
return self.raw_member.get('roles')

@overrides(UserInterface)
def get_priv(self):
if self.get_id() in config.SUPER_USER:
Expand All @@ -59,17 +62,32 @@ def get_priv(self):
return ADMIN
return NORMAL

def get_roles(self):
if self.roles == None:
my_roles_id = self.raw_member.get('roles') # only role id in this list
bot = get_bot()
all_roles = bot.get_roles_by_group(self.raw_member.get('guild_id'))

my_roles = []
for role in all_roles:
for rid in my_roles_id:
if role["id"] == rid:
my_roles.append(role)
self.roles = my_roles
return self.roles

@overrides(UserInterface)
def is_admin(self):
return False #FIXME: wait for sdk to process permissions
permission = calculate_permission(self.get_roles())
return has_permission_for(permission, TomonPriv.ADMINISTRATOR)

def is_owner(self):
if self.group == None:
guild_id = self.raw_member.get('guild_id')
if guild_id == None:
return False
_bot = get_bot().get_raw_bot()
self.group = TomonGroup(asyncio.run(_bot.api().route(f'/guilds/{guild_id}').get()))
bot = get_bot()
self.group = bot.get_group_by_id(guild_id)
if self.group.get_owner_id() == self.get_id():
return True
return False
Expand Down
11 changes: 10 additions & 1 deletion kokkoro/bot/tomon/tomon_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,13 @@ def normalize_at(raw_at):
"""
规范化 at 信息,"<@123>" => " @123 "
"""
return f' @{raw_at[2:-1]} '
return f' @{raw_at[2:-1]} '

def has_permission_for(src, dst):
return src & dst != 0

def calculate_permission(roles, everyone=0):
permission = everyone
for role in roles:
permission = permission | role["permissions"]
return permission
2 changes: 1 addition & 1 deletion kokkoro/bot/wechat_enterprise/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
def get_bot():
global kkr_bot
if kkr_bot == None:
from kokkoro.wechat_enterprise.bot import KokkoroWechatEpBot
from kokkoro.bot.wechat_enterprise.bot import KokkoroWechatEpBot
kkr_bot = KokkoroWechatEpBot(config)
return kkr_bot
2 changes: 1 addition & 1 deletion kokkoro/bot/wechat_enterprise/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import kokkoro
from kokkoro.typing import overrides
from kokkoro.common_interface import KokkoroBot, EventInterface, SupportedMessageType
from kokkoro.wechat_enterprise.wechat_enterprise_adaptor import WechatEpEvent
from kokkoro.bot.wechat_enterprise.wechat_enterprise_adaptor import WechatEpEvent

def wechat_handler(bot):
async def wrapper():
Expand Down
1 change: 1 addition & 0 deletions kokkoro/bot/wechat_enterprise/wechat_enterprise_adaptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from kokkoro.util import to_string
from kokkoro.common_interface import EventInterface
from kokkoro import config
from kokkoro.typing import overrides

class WechatEpEvent(EventInterface):
def __init__(self, raw_event: BaseMessage):
Expand Down
2 changes: 1 addition & 1 deletion kokkoro/config_example/modules/pcrclanbattle.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[ 6000000, 8000000, 10000000, 12000000, 15000000],
[ 6000000, 8000000, 10000000, 12000000, 15000000],
[ 7000000, 9000000, 13000000, 15000000, 20000000],
[15000000, 16000000, 18000000, 19000000, 20000000]
[17000000, 18000000, 20000000, 21000000, 23000000]
],
"SCORE_RATE_JP": [
[1.2, 1.2, 1.3, 1.4, 1.5],
Expand Down
25 changes: 13 additions & 12 deletions kokkoro/config_example/modules/priconne.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class arena:
"up_prob": 14,
"s3_prob": 50,
"s2_prob": 180,
"up": [ "真阳(游侠)", "拉比林斯达" ],
"up": [ "凛(NGs)", "怜(万圣节)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","真步","璃乃","初音","霞","伊绪",
Expand All @@ -94,7 +94,7 @@ class arena:
"亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿",
"リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨"
"铃(游侠)", "真阳(游侠)", "璃乃(奇幻)"
],
"other_normal_star3": [ ],
"star2": [
Expand All @@ -112,17 +112,18 @@ class arena:
"up_prob": 7,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "真阳(游侠)" ],
"up": [ "凛(NGs)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","真步","璃乃","初音","霞","伊绪",
"咲恋","望","妮诺","秋乃","镜华","智","真琴",
"伊莉亚","纯","静流","莫妮卡","流夏","吉塔",
"亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿"
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿",
"铃(游侠)", "真阳(游侠)", "璃乃(奇幻)", "祈梨"
],
"other_normal_star3": [ "リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨"],
"other_normal_star3": [ ],
"star2": [
"茉莉","茜里","宫子","雪","七七香","美里",
"铃奈","香织","美美","绫音","铃","惠理子",
Expand All @@ -138,7 +139,7 @@ class arena:
"up_prob": 7,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "拉比林斯达" ],
"up": [ "怜(万圣节)" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","真步","璃乃","初音","霞","伊绪",
Expand All @@ -147,7 +148,7 @@ class arena:
"亚里莎","安","古蕾娅", "空花(大江户)", "妮诺(大江户)",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿",
"リン(レンジャー)", "マヒル(レンジャー)", "璃乃(奇境)", "祈梨",
"铃(游侠)", "真阳(游侠)", "璃乃(奇幻)", "祈梨",
"七七香(夏日)"
],
"other_normal_star3": [ ],
Expand All @@ -163,27 +164,27 @@ class arena:
]
},
"BL": {
"up_prob": 7,
"up_prob": 14,
"s3_prob": 25,
"s2_prob": 180,
"up": [ "凯留(夏日)" ],
"up": [ "环奈" ],
"_comment": "star3 仅填3星常驻角色。不要填UP角,否则出率会偏高",
"star3": [
"杏奈","璃乃","初音","伊绪",
"望","妮诺","秋乃", "亚里莎",
"静流","莫妮卡","吉塔", "纯", "镜华",
"伊莉亚", "真步", "咲恋", "真琴"
"伊莉亚", "真步", "咲恋", "真琴", "智"
],
"other_normal_star3": [
"霞", "智", "纯", "流夏", "安", "古蕾娅","空花(大江户)", "妮诺(大江户)",
"霞", "流夏", "安", "古蕾娅","空花(大江户)", "妮诺(大江户)",
"克萝依", "碧(插班生)", "美美(万圣节)", "露娜",
"伊莉亚(圣诞节)", "霞(魔法少女)", "优妮", "琪爱儿"
],
"star2": [
"茜里","宫子","雪","铃",
"铃奈","香织","美美","绫音","惠理子",
"真阳","栞","千歌","空花","珠希","美冬",
"深月", "美里", "纺希", "忍"
"深月", "美里", "纺希", "忍", "茉莉"
],
"star1" : [
"日和","怜","禊","胡桃","依里","铃莓",
Expand Down
3 changes: 2 additions & 1 deletion kokkoro/modules/arknights/recruit.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ async def _async_init():
else:
sv.logger.error("Fail to load recruit info of arknights")

asyncio.run(_async_init())
loop = asyncio.new_event_loop()
loop.run_until_complete(_async_init())

HELP_MESSAGE = '请输入标签。默认仅显示必得4★的TAG组合\n示例:公开招募 位移 近战位\n显示所有可能干员请使用参数"-a"或"全部"\n示例:公开招募 -a 位移 近战位\n网页版:https://www.bigfun.cn/tools/aktools-old/akhr.html'
@sv.on_prefix(('ark-recruit','公开招募', "公招"))
Expand Down
2 changes: 2 additions & 0 deletions kokkoro/modules/pcrclanbattle/clanbattle/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# 公主连接Re:Dive会战管理插件
# clan == クラン == 戰隊(直译为氏族)(CLANNAD的CLAN(笑))
from functools import wraps

from .argparse import ArgParser
from .exception import *
Expand All @@ -23,6 +24,7 @@ def cb_cmd(prefixes, parser:ArgParser) -> Callable:
raise ValueError('`name` of cb_cmd must be `str` or `Iterable[str]`')

def deco(func):
@wraps(func)
async def wrapper(bot: KokkoroBot, ev: EventInterface):
try:
args = parser.parse(ev.get_param().args, ev)
Expand Down
27 changes: 23 additions & 4 deletions kokkoro/modules/pcrclanbattle/clanbattle/battlemaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,30 @@ def get_config():


class BattleMaster(object):
'''
Different bits represent different damage kind:
'''
NORM = BattleDao.NORM # 0
LAST = BattleDao.LAST # 1<<0
EXT = BattleDao.EXT # 1<<1
TIMEOUT = BattleDao.TIMEOUT # 1<<2

NORM = BattleDao.NORM
LAST = BattleDao.LAST
EXT = BattleDao.EXT
TIMEOUT = BattleDao.TIMEOUT
@staticmethod
def has_damage_kind_for(src, dst):
return src & dst != 0

@staticmethod
def damage_kind_to_string(src):
res = []
if src & BattleMaster.EXT:
res.append('补时')
if src & BattleMaster.LAST:
res.append('尾刀')
if src & BattleMaster.TIMEOUT:
res.append('掉线')
if src == BattleMaster.NORM:
res.append('通常')
return res

SERVER_JP = ClanDao.SERVER_JP
SERVER_TW = ClanDao.SERVER_TW
Expand Down
52 changes: 30 additions & 22 deletions kokkoro/modules/pcrclanbattle/clanbattle/cmdv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,39 +201,47 @@ async def process_challenge(bot:KokkoroBot, ev:EventInterface, ch:ParseResult):
cur_round, cur_boss, cur_hp = bm.get_challenge_progress(1, now)
round_ = ch.round or cur_round
boss = ch.boss or cur_boss
damage = ch.damage if ch.flag != BattleMaster.LAST else (ch.damage or cur_hp)

damage = None
if not (ch.round or ch.boss):
# 当前周目并且是尾刀,则自动将伤害设置为当前血量
if BattleMaster.has_damage_kind_for(ch.flag, BattleMaster.LAST):
damage = cur_hp
if not damage:
if not ch.damage:
raise NotFoundError('请给出伤害值')
damage = ch.damage


flag = ch.flag

if (ch.flag == BattleMaster.LAST) and (ch.round or ch.boss) and (not damage):
raise NotFoundError('补报尾刀请给出伤害值') # 补报尾刀必须给出伤害值
# if (ch.flag == BattleMaster.LAST) and (ch.round or ch.boss) and (not damage):
# raise NotFoundError('补报尾刀请给出伤害值') # 补报尾刀必须给出伤害值

msg = ['']

# 上一刀如果是尾刀,这一刀就是补偿刀
challenges = bm.list_challenge_of_user_of_day(mem['uid'], mem['alt'], now)
if len(challenges) > 0 and challenges[-1]['flag'] == BattleMaster.LAST:
flag = BattleMaster.EXT
flag = flag | BattleMaster.EXT
msg.append('⚠️已自动标记为补时刀')

if round_ != cur_round or boss != cur_boss:
msg.append('⚠️上报与当前进度不一致')
else: # 伤害校对
eps = 30000
if damage > cur_hp + eps:
damage = cur_hp
msg.append(f'⚠️过度虐杀 伤害数值已自动修正为{damage}')
if flag == BattleMaster.NORM:
flag = BattleMaster.LAST
if damage >= cur_hp:
if damage > cur_hp:
damage = cur_hp
msg.append(f'⚠️过度虐杀 伤害数值已自动修正为{damage}')
# 不是尾刀,则标记为尾刀
if not BattleMaster.has_damage_kind_for(flag, BattleMaster.LAST):
flag = flag | BattleMaster.LAST
msg.append('⚠️已自动标记为尾刀')
elif flag == BattleMaster.LAST:
if damage < cur_hp - eps:
msg.append('⚠️尾刀伤害不足 请未报刀成员及时上报')
elif damage < cur_hp:
if damage % 1000 == 0:
damage = cur_hp
msg.append(f'⚠️尾刀伤害已自动修正为{damage}')
else:
msg.append('⚠️Boss仍有少量残留血量')

elif BattleMaster.has_damage_kind_for(flag, BattleMaster.LAST):
if damage < cur_hp:
damage = cur_hp
msg.append(f'⚠️尾刀伤害已自动修正为{damage}')

eid = bm.add_challenge(mem['uid'], mem['alt'], round_, boss, damage, flag, now)
aft_round, aft_boss, aft_hp = bm.get_challenge_progress(1, now)
Expand All @@ -250,11 +258,11 @@ async def process_challenge(bot:KokkoroBot, ev:EventInterface, ch:ParseResult):
await auto_unsubscribe(bot, ev, bm.group, mem['uid'], boss)

def isDD(damage):
return damage < 450000
return damage < 600000

import random
async def jiuzhe(bot, ev):
msglist = ['这是法刀吗?', f'恁搁着挠痒痒呢?', f'就这?', R.img('就这.jpg')]
msglist = ['就这?', R.img('就这.jpg')]
index = random.randint(0, len(msglist)-1)
await bot.kkr_send(ev, msglist[index])

Expand Down Expand Up @@ -879,7 +887,7 @@ async def list_challenge(bot:KokkoroBot, ev:EventInterface, args:ParseResult):
mem = bm.get_member(c['uid'], c['alt'])
c['name'] = mem['name'] if mem else c['uid']
flag = c['flag']
c['flag_str'] = '|补时' if flag & bm.EXT else '|尾刀' if flag & bm.LAST else '|掉线' if flag & bm.TIMEOUT else '|通常'
c['flag_str'] = '|' + ','.join(BattleMaster.damage_kind_to_string(flag))
msg.append(challenstr.format_map(c))
await bot.kkr_send(ev, '\n'.join(msg))

Expand Down
Loading

0 comments on commit 22b1002

Please sign in to comment.