def start_new_lottery(msg: QQMessage): group_number = msg.group_number sponsor_group_card = msg.sender_group_card if get_lottery_in_group(group_number): interpreter.send_msg( QQMessage(group_number=group_number, message='群里已经有正在进行的抽奖了')) else: message = msg.message award = message[message.find('#') + 1:] sponsor_number = msg.sender_number sponsor_card = msg.sender_group_card with rw_lock, open(os.path.join(CURRENT_OS_PATH, SERIALIZE_PATH), 'wb+') as fp: lottery_list.append( Lottery(group_number=group_number, sponsor_number=sponsor_number, sponsor_card=sponsor_card, award=award)) pickle.dump(lottery_list, fp) interpreter.set_group_card_suffix(group_number=group_number, suffix='[抽奖中]') interpreter.send_msg( QQMessage(group_number=group_number, message=sponsor_group_card + '开启了抽奖 奖品:' + award))
def test_url(torn_number, group_number, sender_number): errorinfo = [] url_base="https://api.torn.com/user/" url_last="?selections=profile&key=%s" % GLOBAL_CONFIG.GET_API_KEY() rereadtime=60 global indexer if 1==1: resp = None print("Inveistigating user [" + torn_number + "]") try: resp = requests.get(url_base + torn_number + url_last, timeout=7) print (resp) except ( requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout) as e: print("request exceptions:" + str(e)) print("Inveistigate " + torn_number + " timeout") return else: if resp.status_code >= 400: print("response status code fail:" + str(resp.status_code)) print("Inveistigate " + torn_number + " fail, status code:" + str(resp.status_code)) return body = resp.text dct = json.loads(body) if ("error" in dct): print("API Error") t = Timer(rereadtime, test_url) t.start() return ret_message = "用户名:"+str(dct.get("name"))+"\n活动:"+str(dct.get("status").get("description"))+"\n状态:"+str(dct.get("status").get("state"))+"\n血量:"+str(dct.get("life").get("current"))+"/"+str(dct.get("life").get("maximum")) interpreter.send_msg(QQMessage(group_number=group_number, sender_number=sender_number, message=ret_message))
def query_for_all_information_key(msg: QQMessage): key_list = [x[0] for x in bingwa_db_center.query_for_all_key()] text = '\n'.join(key_list) image_path = utils.text_to_image(text) interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, image_path=image_path))
def lottery_description(msg: QQMessage): all_solve_list = [] for k, v in lottery_draw_detailed_commands_description.items(): all_solve_list.append(k + ':' + v) interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='\n'.join(all_solve_list)))
def query_for_all_special_key(msg: QQMessage): key_list = [ 'fly', 'win', 'lost' 'jail' 'hosp', 'xan', 'networth', 'point', 'Mug', 'bs', 'od', 'lsd', 'extt' ] text = ', '.join(key_list) interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=text))
def query_for_information(msg: QQMessage): sender_card = msg.sender_group_card message = msg.message main_message = message[message.find('#') + 1:] key, torn_number = main_message.split('#') try: torn_number = str(int(torn_number)) if torn_number == '0': torn_number = utils.split_torn_numner(sender_card) else: sender_card = torn_number except Exception as e: torn_number = utils.split_torn_numner(sender_card) if torn_number == '0' and False: interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='财富密码识别失败')) else: rows = bingwa_db_center.query_for_information(key, torn_number) reply = '' if len(rows) <= 0: reply = '查询出错了' else: trans_date = [row[0] for row in rows] data = [row[1] for row in rows] function_type = rows[0][2] if trans_date[0].lower() == 'list': reply = '请使用更详细的关键字查询: %s' % (', '.join(data)) elif trans_date[0].lower() == 'error': reply = data[0] else: reply = '%s\n' % sender_card reply += '查询参数: %s\n' % function_type reply += '当前: %s\n' % utils.number_to_format_str(data[-1]) if len(data) > 1: data_steps = [ data[i] - data[i - 1] for i in range(1, len(data)) ] reply += "增量: %s" % utils.number_to_format_str( data_steps[0]) for step in data_steps[1:]: reply += ' -> %s' % utils.number_to_format_str(step) reply += '\n' reply += '平均: %s' % utils.number_to_format_str( sum(data_steps) / len(data_steps)) interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=reply))
def abort_lottery(msg: QQMessage): group_number = msg.group_number sender_number = msg.sender_number lottery = get_lottery_in_group(group_number) if not lottery or lottery.sponsor_number != sender_number: return else: lottery_list_lock.acquire() lottery_list.remove(lottery) lottery_list_lock.release() interpreter.send_msg( QQMessage(group_number=group_number, message='抽奖中止了'))
def query_pointsmarket(msg: QQMessage): reply = '' item_list = APICenter.query_pointsmarket() if len(item_list) > 0: reply += '当前Points价格:\n' for cost, quantity in item_list: reply += '价格:%d 数量%d\n' % (cost, quantity) reply = reply[:-1] else: reply = '查询出错' image_path = utils.text_to_image(reply) interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=reply, image_path=image_path)) return
def abort_lottery(msg: QQMessage): group_number = msg.group_number sender_number = msg.sender_number lottery = get_lottery_in_group(group_number) if not lottery or lottery.sponsor_number != sender_number: return else: with rw_lock, open(os.path.join(CURRENT_OS_PATH, SERIALIZE_PATH), 'wb+') as fp: lottery_list.remove(lottery) pickle.dump(lottery_list, fp) interpreter.send_msg( QQMessage(group_number=group_number, message='抽奖中止了')) interpreter.set_group_card_suffix(group_number=group_number, suffix='[没有抽奖]')
def current_lottery(msg: QQMessage): group_number = msg.group_number lottery = get_lottery_in_group(group_number) if not lottery: interpreter.send_msg( QQMessage(group_number=group_number, message='当前没有抽奖')) return else: interpreter.send_msg( QQMessage(group_number=group_number, message='现在正在进行的是由%s送出的%s的抽奖\n参与抽奖的有:\n%s' % (lottery.sponsor_card, lottery.award, '\n'.join([ participant.participant_card for participant in lottery.participants ]))))
def query_bazaar_by_nickname(msg: QQMessage): message = msg.message to_match = message[message.find('#')+1:] if len(to_match) == 0: interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='商品名不能为空')) return match_list = process.extractBests(to_match, item_nickname_map.keys()) match_name_list = [m[0] for m in match_list] confidences_list = [m[1] for m in match_list] reply = '' if confidences_list[0] > 60: # 置信度大于60 match_name = match_name_list[0] reply += match_name + '\n' item_id = item_nickname_map[match_name] item_list = APICenter.query_bazaar_item(item_id) if len(item_list) == 0: reply += '市场上没有该商品\n' for item in item_list[:5]: reply += '价格:%s, 数量:%d\n' % (utils.number_to_format_str(item[0]), item[1]) maybe = [] for match_name, confidence in match_list[1:4]: if confidence > 60 and item_nickname_map[match_name] != item_id and item_nickname_map[match_name] not in [item_nickname_map[may_name] for may_name in maybe]: maybe.append(match_name) if maybe: print(maybe) reply += '您可能要查找: %s' % '、'.join(maybe) else: reply = reply[:-1] else: maybe = [] for match_name, confidence in match_list[:4]: if confidence > 60 and item_nickname_map[match_name] not in [item_nickname_map[may_name] for may_name in maybe]: maybe.append(match_name) if maybe: print(maybe) reply += '您可能要查找: %s' % '、'.join(maybe) if len(reply) == 0: reply = '查无结果' interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=reply)) return
def query_for_rank(msg: QQMessage): sender_card = msg.sender_group_card message = msg.message main_message = message[message.find('#')+1:] key, torn_number = main_message.split('#') rows = bingwa_db_center.query_for_information(key) reply = '' if len(rows) <= 0: reply ='查询出错了' else: for row in rows reply += row reply += '\n' interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=reply)) # --*-- 接口 --*-- # bingwa_db_commands = { '信息#': query_for_information, '排行#': query_for_rank, '所有参数#': query_for_all_key } bingwa_db_commands_description = { '信息#': '信息#[关键字]#[id]查询数据,id留空则查询财富密码', '所有参数#': '查询所有参数' } # def solve_description(): return bingwa_db_commands_description def solve_test(msg: QQMessage): message = msg.message.lower() command = message for command in bingwa_db_commands.keys(): if message.startswith(command): return bingwa_db_commands.get(command) def solve(msg: QQMessage): if solve_test(msg): thread = threading.Thread(target=solve_test(msg), args=(msg,)) thread.start()
def search_flower_plushie_for(msg: QQMessage): message = msg.message nickname = message[message.find('#')+1:].lower() country = get_country_by_nickname(nickname) countries = [] if country: countries = [country] else: countries = country_nickname_map.keys() target_ids = [] for item_ids in [country_flower_plushie_map.get(country) for country in countries]: for item_id in item_ids: target_ids.append(item_id) target_dict = {} for item in spider.foreign_item_list: if item.item_id in target_ids: # FIXME: xanax的id有几个重复 要判断是不是南非的 if item.item_id == 206 and item.country != 'South Africa': pass else: if target_dict.get(item.country): target_dict[item.country].append(item) else: target_dict[item.country] = [item] if not target_dict: interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='查询出错')) else: ret_message = '' for country,items in target_dict.items(): country_name = country_name_map[country] ret_message += "%s" % country_name if len(country_name) < 3: ret_message += '\t' ret_message += ':' for item in items: ret_message += " %s%d" % (item_name_map[item.item_id], item.stock) ret_message += '\n' interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=ret_message[:-1])) return
def participate_in_lottery(msg: QQMessage): group_number = msg.group_number sender_number = msg.sender_number sender_group_card = msg.sender_group_card lottery = get_lottery_in_group(group_number) if not lottery: return else: if sender_number in [ x.participant_number for x in lottery.participants ]: interpreter.send_msg( QQMessage(sender_number=sender_number, message=sender_group_card + ': 您已参加')) else: participant = Participant(participant_number=sender_number, participant_card=sender_group_card) lottery.participants.append(participant) interpreter.send_msg( QQMessage(sender_number=sender_number, message=sender_group_card + ': 参加成功'))
def start_new_lottery(msg: QQMessage): group_number = msg.group_number sponsor_group_card = msg.sender_group_card if get_lottery_in_group(group_number): interpreter.send_msg( QQMessage(group_number=group_number, message='群里已经有正在进行的抽奖了')) else: message = msg.message award = message[message.find('#') + 1:] sponsor_number = msg.sender_number sponsor_card = msg.sender_group_card lottery_list_lock.acquire() lottery_list.append( Lottery(group_number=group_number, sponsor_number=sponsor_number, sponsor_card=sponsor_card, award=award)) lottery_list_lock.release() interpreter.send_msg( QQMessage(group_number=group_number, message=sponsor_group_card + '开启了抽奖 奖品:' + award))
def end_lottery(msg: QQMessage): message = msg.message group_number = msg.group_number sender_number = msg.sender_number try: lucky_sum = int(message[message.find('#') + 1:]) if lucky_sum <= 0: raise Exception except Exception as e: interpreter.send_msg( QQMessage(group_number=group_number, message='参数有误')) return lottery = get_lottery_in_group(group_number) if not lottery or lottery.sponsor_number != sender_number: return else: with rw_lock, open(os.path.join(CURRENT_OS_PATH, SERIALIZE_PATH), 'wb+') as fp: lottery_list.remove(lottery) pickle.dump(lottery_list, fp) participants = lottery.participants if len(participants) <= 0: interpreter.set_group_card_suffix(group_number=group_number, suffix='[没有抽奖]') interpreter.send_msg( QQMessage(group_number=group_number, message='参与人数不足,抽奖已结束')) else: lucky_list = [] for idx in random.sample(range(0, len(participants)), min(lucky_sum, len(participants))): lucky_list.append(participants[idx]) interpreter.set_group_card_suffix(group_number=group_number, suffix='[没有抽奖]') interpreter.send_msg( QQMessage(group_number=group_number, message='开奖结果:\n%s\n获得了%s送出的:%s' % ('\n'.join([ "[CQ:at,qq=%s]" % participant.participant_number for participant in lucky_list ]), lottery.sponsor_card, lottery.award))) for p in participants: interpreter.send_msg( QQMessage(sender_number=p.participant_number, message='开奖结果:\n%s\n获得了%s送出的:%s' % ('\n'.join([ "%s" % participant.participant_card for participant in lucky_list ]), lottery.sponsor_card, lottery.award)))
def current_lottery(msg: QQMessage, use_image=True): group_number = msg.group_number lottery = get_lottery_in_group(group_number) if not lottery: interpreter.set_group_card_suffix(group_number=group_number, suffix='[没有抽奖]') interpreter.send_msg( QQMessage(group_number=group_number, message='当前没有抽奖')) return else: interpreter.set_group_card_suffix(group_number=group_number, suffix='[抽奖中]') reply = '现在正在进行的是\n由%s送出的%s的抽奖\n参与抽奖共计%d人:\n%s' % ( lottery.sponsor_card, lottery.award, len( lottery.participants), '\n'.join([ participant.participant_card for participant in lottery.participants ])) if use_image: interpreter.send_msg( QQMessage(group_number=group_number, image_path=utils.text_to_image(reply))) else: interpreter.send_msg( QQMessage(group_number=group_number, message=reply))
def participate_in_lottery(msg: QQMessage): group_number = msg.group_number sender_number = msg.sender_number sender_group_card = msg.sender_group_card lottery = get_lottery_in_group(group_number) if not lottery: interpreter.send_msg( QQMessage(group_number=group_number, message='当前没有抽奖')) return else: if sender_number in [ x.participant_number for x in lottery.participants ]: interpreter.send_msg( QQMessage(sender_number=sender_number, message=sender_group_card + ': 您已参加\n[%s - %s]' % (lottery.sponsor_card, lottery.award))) else: participant = Participant(participant_number=sender_number, participant_card=sender_group_card) with rw_lock, open(os.path.join(CURRENT_OS_PATH, SERIALIZE_PATH), 'wb+') as fp: lottery.participants.append(participant) pickle.dump(lottery_list, fp) interpreter.send_msg( QQMessage(sender_number=sender_number, message=sender_group_card + ': 参加成功\n[%s - %s]' % (lottery.sponsor_card, lottery.award)))
def query_for_monthly_rank(msg: QQMessage): message = msg.message query_key = None query_faction_key = None try: _, query_key, query_faction_key = message.split('#') if len(query_faction_key) == 0: query_faction_key = 0 else: query_faction_key = int(query_faction_key) if query_faction_key < 0: raise Exception('rank faction 参数错误') query_faction_key = str(query_faction_key) except Exception as e: print('rank 拆分参数出错') interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='拆分参数出错')) return rows = bingwa_db_center.query_for_monthly_rank(query_key, query_faction_key) if len(rows) <= 0: interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='查询出错了')) elif len(rows) == 1 and rows[0][1] == 2509529 and rows[0][-1] == 0: interpreter.send_msg( QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message=rows[0][-2])) else: tb = PrettyTable() tb.field_names = ['RankID', 'player_id', 'name', 'Faction', 'Data'] for row in rows: row = [x for x in row] row[-1] = utils.number_to_format_str(row[-1]) tb.add_row(row) interpreter.send_msg( QQMessage( group_number=msg.group_number, sender_number=msg.sender_number, image_path=utils.text_to_image('月报查询:%s faction:%s\n' % (query_key, query_faction_key) + str(tb))))
def restart_spider(msg: QQMessage): sender_number = msg.sender_number if sender_number not in GLOBAL_CONFIG.super_user: return interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='正在重启库存')) global spider_thread if spider_thread.is_alive(): _async_raise(spider_thread.ident, SystemExit) spider_thread = spider.commence_life_cycle() interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='强制退出并重启')) else: spider_thread = spider.commence_life_cycle() interpreter.send_msg(QQMessage(group_number=msg.group_number, sender_number=msg.sender_number, message='已重启'))
def end_lottery(msg: QQMessage): message = msg.message group_number = msg.group_number sender_number = msg.sender_number try: lucky_sum = int(message[message.find('#') + 1:]) if lucky_sum <= 0: raise Exception except Exception as e: interpreter.send_msg( QQMessage(group_number=group_number, message='参数有误')) return lottery = get_lottery_in_group(group_number) if not lottery or lottery.sponsor_number != sender_number: return else: lottery_list_lock.acquire() lottery_list.remove(lottery) lottery_list_lock.release() participants = lottery.participants if len(participants) <= 0: interpreter.send_msg( QQMessage(group_number=group_number, message='参与人数不足,抽奖已结束')) else: lucky_list = [] while len(lucky_list) < lucky_sum and len(lucky_list) < len( participants): r = random.randint(0, len(participants) - 1) if participants[r] not in lucky_list: lucky_list.append(participants[r]) interpreter.send_msg( QQMessage(group_number=group_number, message='开奖结果:\n%s\n获得了%s送出的:%s' % ('\n'.join([ participant.participant_card for participant in lucky_list ]), lottery.sponsor_card, lottery.award)))
def query_chain_simple(msg): raw_message = APICenter.chain_simple_info_make() interpreter.send_msg( QQMessage(message=raw_message, group_number=msg.group_number, sender_number=msg.sender_number))