async def add_member(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) uid = args['@'] or args.uid name = args[''] or args.name author = ev.get_author() if uid == None: uid = ev.get_author_id() else: if uid != ev.get_author_id(): _check_admin(ev, '才能添加其他人') # if not ev.whether_user_in_group(uid): # raise NotFoundError(f'Error: 无法获取该群员信息,请检查{uid}是否属于本群') ## if we can't get name from mentions # if not name and : # m = await bot.get_group_member_info(self_id=ctx['self_id'], group_id=bm.group, user_id=uid) # name = m['card'] or m['nickname'] or str(m['user_id']) name = name or author.get_nick_name() or author.get_name() mem = bm.get_member(uid, bm.group) or bm.get_member(uid, 0) # 兼容cmdv1 if mem: bm.mod_member(uid, mem['alt'], name, 1) await bot.kkr_send(ev, f'成员{bot.kkr_at(uid)}昵称已修改为{name}') else: bm.add_member(uid, bm.group, name, 1) await bot.kkr_send( ev, f"成员{bot.kkr_at(uid)}添加成功!欢迎{name}加入{clan['name']}")
async def lock_boss(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) _check_clan(bm) _check_member(bm, ev.get_author_id(), bm.group) sub = _load_sub(bm.group) lock = sub.get_lock_info() if lock: uid, ts = lock[0] time = datetime.fromtimestamp(ts) mem = bm.get_member(uid, bm.group) or bm.get_member(uid, 0) or { 'name': str(uid) } delta = datetime.now() - time delta = timedelta(seconds=round( delta.total_seconds())) # ignore miliseconds msg = f"\n锁定失败:{mem['name']}已于{delta}前锁定了Boss" await bot.kkr_send(ev, msg, at_sender=True) else: uid = ev.get_author_id() time = datetime.now() sub.set_lock(uid, datetime.now().timestamp()) _save_sub(sub, bm.group) msg = f"已锁定Boss" await bot.kkr_send(ev, msg, at_sender=True)
async def del_member(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = args['@'] or args.uid or ev.get_author_id() mem = _check_member(bm, uid, bm.group, '公会内无此成员') if uid != ev.get_author_id(): _check_admin(ev, '才能踢人') bm.del_member(uid, mem['alt']) await bot.kkr_send(ev, f"成员{mem['name']}已从公会删除", at_sender=True)
async def lssv(bot: KokkoroBot, ev: EventInterface): parser = ArgumentParser() parser.add_argument('-a', '--all', action='store_true') parser.add_argument('-i', '--invisible', action='store_true') parser.add_argument('-g', '--group', type=int, default=0) args = parser.parse_args(ev.get_param().remain) verbose_all = args.all only_hidden = args.invisible if ev.get_author_id() in bot.config.SUPER_USER: gid = args.group or ev.get_group_id() if not gid: await bot.kkr_send(ev, 'Usage: -g|--group <group_id> [-a|--all]') return else: gid = ev.get_group_id() msg = [f"群{gid}服务一览:"] svs = Service.get_loaded_services().values() svs = map(lambda sv: (sv, sv.check_enabled(gid)), svs) key = cmp_to_key(lambda x, y: (y[1] - x[1]) or (-1 if x[0].name < y[ 0].name else 1 if x[0].name > y[0].name else 0)) svs = sorted(svs, key=key) for sv, on in svs: if verbose_all or (sv.visible ^ only_hidden): x = '○' if on else '×' msg.append(f"|{x}| {sv.name}") await bot.kkr_send(ev, '\n'.join(msg))
async def login(bot: KokkoroBot, ev: EventInterface, args: ParseResult): if False and "this message is from group": # FIXME return '请私聊使用' wm = WebMaster() uid = ev.get_author_id() gid = ev.get_group_id() auth = ev.get_author().get_priv() member = wm.get_member(uid, gid) if member is None: await bot.kkr_send(ev, '请先加入公会') return member['authority_group'] = 100 if auth == SUPERUSER: member['authority_group'] = 1 elif auth == ADMIN: member['authority_group'] = 10 wm.mod_member(member) user = wm.get_or_add_user(uid, rand_string(16)) login_code = rand_string(6) user['login_code'] = login_code user['login_code_available'] = True user['login_code_expire_time'] = int(time.time()) + 60 wm.mod_user(user) url = urljoin( config.PUBLIC_ADDRESS, '{}login/c/#uid={}&key={}'.format( config.PUBLIC_BASEPATH, user['uid'], login_code, )) await bot.kkr_send_dm(ev, url)
async def subscribe(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = ev.get_author_id() _check_clan(bm) _check_member(bm, uid, bm.group) sub = _load_sub(bm.group) boss = args[''] memo = args.M boss_name = bm.int2kanji(boss) slist = sub.get_sub_list(boss) mlist = sub.get_memo_list(boss) limit = sub.get_sub_limit(boss) if uid in slist: raise AlreadyExistError(f'您已经预约过{boss_name}王了') msg = [''] if len(slist) < limit: sub.add_sub(boss, uid, memo) _save_sub(sub, bm.group) msg.append(f'已为您预约{boss_name}王!') else: msg.append(f'预约失败:{boss_name}王预约人数已达上限') msg.append(f'=== 当前队列 {len(slist)}/{limit} ===') msg.extend(_gen_namelist_text(bot, bm, slist, mlist)) msg.append(SUBSCRIBE_TIP) await bot.kkr_send(ev, '\n'.join(msg), at_sender=True)
async def _select_(bot: KokkoroBot, ev: EventInterface): global g_uid_dict, g_status_dict gid = ev.get_group_id() uid = ev.get_author_id() horse_status: HorseStatus = g_status_dict.get(gid) if horse_status == None: await bot.kkr_send(ev, f'比赛尚未开始,发送指令"赛🐴"发起新的游戏', at_sender=True) elif not horse_status.multi_player and uid != g_uid_dict[gid]: await bot.kkr_send(ev, f'仅限比赛发起人进行选择~\n发送指令"多人赛🐴"发起多人游戏') else: pkey = ev.get_param().remain id_ = chara.name2id(pkey) s_chara = chara.fromid(id_) if s_chara.name not in g_status_dict[gid].charactors: await bot.kkr_send(ev, f'所选角色未在参赛角色中') return success = horse_status.add_player(uid, s_chara.name) if not success: await bot.kkr_send(ev, f'已经有人选过 {s_chara.name} 了 0x0', at_sender=True) elif horse_status.is_finished(): await bot.kkr_send(ev, f'比赛开始') res = horse_status.get_result() await bot.kkr_send(ev, f'{res}') # Clean up clean(gid) else: await bot.kkr_send(ev, f'已选择{s_chara.name}', at_sender=True)
async def pcr_comp(bot, ev: EventInterface): global g_result, g_uid uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, '今天已经赛过5次力', at_sender=True) return if g_result != []: await bot.kkr_send(ev, '上一场比赛尚未结束,请等待', at_sender=True) return lmt.increase(uid) await bot.kkr_send(ev, f'第○届兰德索尔杯比赛开始!', at_sender=True) gid = str(ev.get_group_id()) player = Player(_group_pool[gid]) result = player.get_chara() result_number = player.get_num() res2 = chara.gen_team_pic(result, star_slot_verbose=False) res1 = chara.gen_team_pic(result_number, star_slot_verbose=False) res = concat_pic([res1, res2]) result_name = [f'{c.name}' for c in result] res_name = ' '.join(result_name) if sv.bot.config.ENABLE_IMAGE: await bot.kkr_send(ev, res) await bot.kkr_send(ev, f'{res_name}\n※发送“选中+角色名称”开始比赛', at_sender=False) else: await bot.kkr_send(ev, f'Image is disabled') save_player(result_name) g_uid = uid
async def decherulize(bot: KokkoroBot, ev: EventInterface): s = ev.get_param().remain if len(s) > 1501: await bot.kkr_send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return msg = bot.kkr_at(ev.get_author_id()) + '的切噜噜是:\n' + escape(cheru2str(s)) # if random.random() < 0.2: # await cheru_record(bot, ev) await bot.kkr_send(ev, msg)
async def add_challenge_timeout(bot: KokkoroBot, ev: EventInterface, args: ParseResult): challenge = ParseResult({ 'round': args.R, 'boss': args.B, 'damage': 0, 'uid': args['@'] or args.uid or ev.get_author_id(), 'flag': BattleMaster.TIMEOUT }) await process_challenge(bot, ev, challenge)
async def add_challenge_last(bot: KokkoroBot, ev: EventInterface, args: ParseResult): challenge = ParseResult({ 'round': args.R, 'boss': args.B, 'damage': args.get(''), 'uid': args['@'] or args.uid or ev.get_author_id(), 'alt': ev.get_group_id(), 'flag': BattleMaster.LAST }) await process_challenge(bot, ev, challenge)
async def _select_(bot, ev: EventInterface): global g_uid, g_result uid = ev.get_author_id() if uid != g_uid and g_result != []: await bot.kkr_send(ev, f'仅限比赛发起人进行选择~') elif uid != g_uid and g_result == []: await bot.kkr_send(ev, f'上一场比赛已经结束,您可以用“@bot赛跑模拟”发起新的比赛', at_sender=True) elif uid == g_uid: await select_player(bot, ev, ev.get_param().remain) else: await bot.kkr_send(ev, f'出现错误,请联系维护组嘤嘤嘤')
def reset_pwd(ev: EventInterface): wm = WebMaster() user = wm.get_or_add_user(ev.get_author_id(), rand_string(16)) raw_pwd = rand_string(8) frontend_salted_pwd = add_salt_and_hash(raw_pwd + user['uid'], FRONTEND_SALT) user['password'] = add_salt_and_hash(frontend_salted_pwd, user['salt']) user['privacy'] = 0 user['must_change_password'] = 1 wm.mod_user(user) wm.del_login(user['uid']) return raw_pwd
async def luck(bot: KokkoroBot, ev: EventInterface): uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, f'你今天已经抽过签了,欢迎明天再来~', at_sender=True) return lmt.increase(uid) #model = 'KYARU' model = 'DEFAULT' luck_img = generate_luck_image(model) await bot.kkr_send(ev, luck_img)
async def give_okodokai(bot, ev: EventInterface): uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, '明日はもう一つプレゼントをご用意してお待ちしますね', at_sender=True) return lmt.increase(uid) present = random.choice(login_presents) todo = random.choice(todo_list) await bot.kkr_send(ev, R.img("priconne/kokkoro_stamp.png")) await bot.kkr_send( ev, f'\nおかえりなさいませ、主さま\n{present}を獲得しました\n私からのプレゼントです\n主人今天要{todo}吗?', at_sender=True)
async def add_challenge(bot: KokkoroBot, ev: EventInterface, args: ParseResult): challenge = ParseResult({ 'round': args.R, 'boss': args.B, 'damage': args.get(''), 'uid': args['@'] or args.uid or ev.get_author_id(), 'flag': BattleMaster.NORM, 'dayoffset': args.get('D', 0) }) await process_challenge(bot, ev, challenge) damage = args.get('') if isDD(damage): await jiuzhe(bot, ev)
async def get_last_5_weibo(bot: KokkoroBot, ev: EventInterface): uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, '您查询得过于频繁,请稍等片刻', at_sender=True) return lmt.start_cd(uid) params = ev.get_param().remain.split(' ') if len(params) == 0 or params[0] == '': await bot.kkr_send(ev, f'使用方法:看微博 <微博别称> <1-5的数字>\n仅支持主动查看最新5条微博~') return alias = params[0] if len(params) == 1: amount = 5 else: try: amount = int(params[1]) except Exception as e: await bot.kkr_send(ev, f'使用方法:看微博 {alias} <1-5的数字>\n仅支持主动查看最新5条微博~') return if amount >= 5 or amount <= 0: amount = 5 if alias not in alias_dic: await bot.kkr_send(ev, f"未找到微博: {alias}") return service_name = alias_dic[alias]["service_name"] user_id = alias_dic[alias]["user_id"] spiders = subr_dic[service_name]["spiders"] for spider in spiders: if spider.get_user_id() == user_id: last_5_weibos = spider.get_last_5_weibos() weibos = last_5_weibos[-amount:] formatted_weibos = [wb_to_message(wb) for wb in weibos] for wb in formatted_weibos: await bot.kkr_send(ev, wb[0]) # send text imgs = wb[1] for img in imgs: await bot.kkr_send(ev, img) # send img await bot.kkr_send(ev, "===================================") await bot.kkr_send(ev, f"以上为 {alias} 的最新 {len(formatted_weibos)} 条微博") return await bot.kkr_send(ev, f"未找到微博: {alias}")
async def add_sos(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = ev.get_author_id() clan = _check_clan(bm) _check_member(bm, uid, bm.group) sub = _load_sub(bm.group) tree = sub.get_tree_list() if uid in tree: raise AlreadyExistError("您已在树上") sub.add_tree(uid) _save_sub(sub, bm.group) msg = ["\n您已上树,本Boss被击败时将会通知您", f"目前{clan['name']}挂树人数为{len(tree)}人:"] msg.extend(_gen_namelist_text(bot, bm, tree)) await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) await bot.kkr_send(ev, R.img('priconne/挂树.jpg'))
async def del_challenge(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) now = datetime.now() clan = _check_clan(bm) ch = bm.get_challenge(args.E, 1, now) if not ch: raise NotFoundError(f'未找到出刀记录E{args.E}') if ch['uid'] != ev.get_author_id(): _check_admin(ev, '才能删除其他人的记录') bm.del_challenge(args.E, 1, now) await bot.kkr_send( ev, f"{clan['name']}已删除{bot.kkr_at(ch['uid'])}的出刀记录E{args.E}", at_sender=True)
async def description_guess_group_ranking(bot: KokkoroBot, ev: EventInterface): members = ev.get_members_in_group() card_winningcount_dict = {} winning_counter = WinningCounter(DB_PATH) for member in members: if member.get_id() != ev.get_author_id(): card_winningcount_dict[ member.get_nick_name()] = winning_counter._get_winning_number( ev.get_group_id(), member.get_id()) group_ranking = sorted(card_winningcount_dict.items(), key=lambda x: x[1], reverse=True) msg = '猜头像小游戏此群排行为:\n' for i in range(min(len(group_ranking), 10)): if group_ranking[i][1] != 0: msg += f'第{i+1}名: {group_ranking[i][0]}, 猜对次数: {group_ranking[i][1]}次\n' await bot.kkr_send(ev, msg.strip())
async def auto_unlock_boss(bot: KokkoroBot, ev: EventInterface, bm: BattleMaster): sub = _load_sub(bm.group) lock = sub.get_lock_info() if lock: uid, ts = lock[0] time = datetime.fromtimestamp(ts) if uid != ev.get_author_id(): mem = bm.get_member(uid) or {'name': str(uid)} delta = datetime.now() - time delta = timedelta(seconds=round( delta.total_seconds())) # ignore miliseconds msg = f"⚠️{mem['name']}于{delta}前锁定了Boss,您出刀前未申请锁定!" await bot.kkr_send(ev, msg, at_sender=True) else: sub.clear_lock() _save_sub(sub, bm.group) msg = f"\nBoss已自动解锁" await bot.kkr_send(ev, msg, at_sender=True)
async def unsubscribe(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = ev.get_author_id() _check_clan(bm) _check_member(bm, uid, bm.group) sub = _load_sub(bm.group) boss = args[''] boss_name = bm.int2kanji(boss) slist = sub.get_sub_list(boss) mlist = sub.get_memo_list(boss) limit = sub.get_sub_limit(boss) if uid not in slist: raise NotFoundError(f'您没有预约{boss_name}王') sub.remove_sub(boss, uid) _save_sub(sub, bm.group) msg = [f'\n已为您取消预约{boss_name}王!'] msg.append(f'=== 当前队列 {len(slist)}/{limit} ===') msg.extend(_gen_namelist_text(bot, bm, slist, mlist)) await bot.kkr_send(ev, '\n'.join(msg), at_sender=True)
async def lssv(bot: KokkoroBot, ev: EventInterface): parser = ArgumentParser() parser.add_argument('-a', '--all', action='store_true') parser.add_argument('-i', '--invisible', action='store_true') parser.add_argument('-g', '--group', type=int, default=0) args = parser.parse_args(ev.get_param().remain) verbose_all = args.all only_hidden = args.invisible if ev.get_author_id() in bot.config.SUPER_USER: gid = args.group or ev.get_group_id() if not gid: await bot.kkr_send(ev, 'Usage: -g|--group <group_id> [-a|--all]') return else: gid = ev.get_group_id() msg = svs_to_msg(Service.get_loaded_services().values(), gid, verbose_all, only_hidden) await bot.kkr_send(ev, msg)
async def on_input_chara_name(bot: KokkoroBot, ev: EventInterface): gid = ev.get_group_id() uid = ev.get_author_id() if winner_judger.get_on_off_status(gid): s = ev.get_param().remain cid = chara.name2id(s) correct_id = winner_judger.get_result(gid) if cid != chara.UNKNOWN and cid == winner_judger.get_result(gid) and winner_judger.get_winner(gid) == None: winner_judger.record_winner(gid, uid) winning_counter = WinningCounter(DB_PATH) winning_counter._record_winning(gid, uid) winning_count = winning_counter._get_winning_number(gid, uid) nick = ev.get_author().get_nick_name() msg_part = f'{nick}猜对了,真厉害!TA已经猜对{winning_count}次了~' c = chara.fromid(correct_id) msg = f'正确答案是: {c.name}' await bot.kkr_send(ev, msg) await bot.kkr_send(ev, c.icon) await bot.kkr_send(ev, msg_part) winner_judger.turn_off(gid)
async def unlock_boss(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) _check_clan(bm) sub = _load_sub(bm.group) lock = sub.get_lock_info() if lock: uid, ts = lock[0] time = datetime.fromtimestamp(ts) if uid != ev.get_author_id(): mem = bm.get_member(uid) or {'name': str(uid)} delta = datetime.now() - time delta = timedelta(seconds=round( delta.total_seconds())) # ignore miliseconds _check_admin(ev, f"才能解锁其他人\n解锁失败:{mem['name']}于{delta}前锁定了Boss") sub.clear_lock() _save_sub(sub, bm.group) msg = f"\nBoss已解锁" await bot.kkr_send(ev, msg, at_sender=True) else: msg = "\n无人锁定Boss" await bot.kkr_send(ev, msg, at_sender=True)
async def send_normal_report(bot:KokkoroBot, event:EventInterface): uid = event.get_author_id() nickname = event.get_author().get_nick_name() gid = event.get_group_id() report = gen_report(gid, uid, nickname, type=REPORT_NORMAL) await bot.kkr_send(event, report)
async def send_report(bot:KokkoroBot, event:EventInterface, type=REPORT_UNDECLARED): if type not in (REPORT_RESIGN,REPORT_NORMAL): await bot.kkr_send(event, "类型错误!", at_sender=True) return uid = event.get_author_id() nickname = event.get_author().get_nick_name() gid = event.get_group_id() if not _lmt.check(uid): await bot.kkr_send(event, f'每{int(_time_limit/60)}分钟仅能生成一次报告', at_sender=True) return _lmt.start_cd(uid) now = datetime.datetime.now() year = now.year month = now.month-1 if month==0: year -= 1 month = 12 constellation = b_constellations[month-1] try: clanname, challenges = get_person(gid,uid,month) except Exception as e: await bot.kkr_send(event, f"出现错误: {str(e)}\n请联系开发组调教。") return if challenges.shape[0] == 0: await bot.kkr_send(event, "您没有参加本次公会战。请再接再厉!", at_sender=True) return total_chl = 0 miss_chl = 0 damage_to_boss: list = [0 for i in range(5)] times_to_boss: list = [0 for i in range(5)] truetimes_to_boss: list = [0 for i in range(5)] total_damage = 0 for idx,chl in challenges.iterrows(): total_damage += chl['dmg'] times_to_boss[chl['boss']-1] += 1 if chl['flag'] == 0: damage_to_boss[chl['boss']-1] += chl['dmg'] truetimes_to_boss[chl['boss']-1] += 1 if chl['flag'] != 1: total_chl += 1 if chl['dmg'] == 0: miss_chl += 1 avg_day_damage = int(total_damage/6) df=pd.DataFrame({'a':damage_to_boss,'b':truetimes_to_boss}) result=(df.a/df.b).replace(np.inf,0).fillna(0) avg_boss_damage = list(result) if total_chl >= 18: disable_chl = 0 attendance_rate = 100 else: disable_chl = 18 - total_chl attendance_rate = round(total_chl/18*100,2) #日期转字符串 year=str(year) month=str(month) #设置中文字体 plt.rcParams['font.family'] = ['Microsoft YaHei'] x = [f'{x}王' for x in range(1,6)] y = times_to_boss plt.figure(figsize=(4.3,2.8)) ax = plt.axes() #设置标签大小 plt.tick_params(labelsize=15) #设置y轴不显示刻度 plt.yticks([]) #绘制刀数柱状图 recs = ax.bar(x,y,width=0.618,color=['#fd7fb0','#ffeb6b','#7cc6f9','#9999ff','orange'],alpha=0.4) #删除边框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) #设置数量显示 for i in range(0,5): rec = recs[i] h = rec.get_height() plt.text(rec.get_x()+0.1, h, f'{int(times_to_boss[i])}刀',fontdict={"size":12}) buf = BytesIO() plt.savefig(buf, format='png', transparent=True, dpi=120) bar_img1 = Image.open(buf) #清空图 plt.clf() x = [f'{x}王' for x in range(1,6)] y = avg_boss_damage plt.figure(figsize=(4.3,2.8)) ax = plt.axes() #设置标签大小 plt.tick_params(labelsize=15) #设置y轴不显示刻度 plt.yticks([]) #绘制均伤柱状图 recs = ax.bar(x,y,width=0.618,color=['#fd7fb0','#ffeb6b','#7cc6f9','#9999ff','orange'],alpha=0.4) #删除边框 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) #设置数量显示 for i in range(0,5): rec = recs[i] h = rec.get_height() plt.text(rec.get_x(), h, f'{int(avg_boss_damage[i]/10000)}万',fontdict={"size":12}) buf = BytesIO() plt.savefig(buf, format='png', transparent=True, dpi=120) bar_img2 = Image.open(buf) #将饼图和柱状图粘贴到模板图,mask参数控制alpha通道,括号的数值对是偏移的坐标 current_folder = os.path.dirname(__file__) img = background1.open() if type==REPORT_RESIGN else background2.open() R img.paste(bar_img1, (580,950), mask=bar_img1.split()[3]) img.paste(bar_img2, (130,950), mask=bar_img2.split()[3]) #添加文字到img row1 = f''' {total_chl} {disable_chl} {total_damage} ''' row2 = f''' {attendance_rate}% {miss_chl} {avg_day_damage} ''' add_text(img, row1, position=(380,630), textsize=35, textfill='black') add_text(img, row2, position=(833,630), textsize=35, textfill='black') add_text(img, year, position=(355,438), textsize=40, textfill='black') add_text(img, month, position=(565,438), textsize=40, textfill='black') add_text(img, constellation, position=(710,438), textsize=40, textfill='black') if len(clanname) <= 7: add_text(img, clanname, position=(300+(7-len(clanname))/2*40, 515), textsize=40, textfill='black') else: add_text(img, clanname, position=(300+(10-len(clanname))/2*30, 520), textsize=30, textfill='black') add_text(img, nickname, position=(280,365), textsize=35, textfill='white') #输出 await bot.kkr_send(event, img) plt.close('all')