def get_bp5info(uid): try: u = osu_user.Osuer() bp5 = u.get_user_bp(uid, m=0, limit=5) if not bp5: return '没有Bp,下一个!!' # TODO uid转uname s_msg = "%s's bp!!\n" % uid for i, r in enumerate(bp5[0:5]): msg = 'bp{x},{pp}pp,{acc}%,{rank},+{mod}' c50 = float(r['count50']) c100 = float(r['count100']) c300 = float(r['count300']) cmiss = float(r['countmiss']) acc = round((c50 * 50 + c100 * 100 + c300 * 300) / (c50 + c100 + c300 + cmiss) / 300 * 100, 2) msg = msg.format(x=i + 1, pp=round(float(r['pp'])), acc=acc, rank=r['rank'], mod=','.join(mods.getMod(int(r['enabled_mods'])))) s_msg = s_msg + msg + '\n' return s_msg[0:-1] except: traceback.print_exc() return '没有Bp,下一个!!'
def setid(uid, qq, groupid): uinfo = get_osuer_info(uid) if not uinfo: return '绑定失败!(why?你自己猜吧' u = osu_user.Osuer() if not u.insert2DB(qq, uinfo['user_id'], groupid, uinfo['username']): return '绑定失败,interBot数据库被玩坏了!' return '绑定成功,使用myinfo查询信息!'
def send2qq(bid, groupid, name, hid=1, mods=-1): o = osu_user.Osuer() ret = o.get_user_from_db2(name) uid = ret['osuid'] if ret else -1 try: drawRank.start(bid, groupid, hid, mods, uid) except: traceback.print_exc() return '打了就是你的top\nosu.ppy.sh/b/%s' % bid, -1 return '[CQ:image,file=file://%s\%s]' % (Config.IMAGE_PATH, 'rank.png'), 1
def myinfo(qq, gid=None): u = osu_user.Osuer() ret = u.get_user_from_db(qq, gid) if not ret: return '未绑定,请使用setid!' home_url = 'https://osu.ppy.sh/u/%s' % (ret['osuname']) msg = "osu:%s\nosuid:%s\nmoney:%s\nbagnum:%s\n%s" % ( ret['osuname'], ret['osuid'], ret['money'], ret['bagnum'], home_url) return msg
def uid_uname(uname=None, qq=None): u = osu_user.Osuer() if uname: ret = u.get_user_from_db2(uname) if ret: return ret['osuid'],ret['osuname'] ret = u.get_user_from_db(qq) if not ret: return 0,0 return ret['osuid'],ret['osuname']
def get_topsrank(groupid, hid=1): ret = score.tops_rank(groupid, hid=hid) if not ret: return '你群0个榜???' u = osu_user.Osuer() uret = u.get_user_from_db3([r['uid'] for r in ret]) udict = {r['osuid']: r['osuname'] for r in uret} outstr = "top榜拥有数排行\n" for i, r in enumerate(ret): outstr = outstr + '#%s %s [%s]\n' % (i + 1, udict[r['uid']], r['num']) return outstr[:-1]
def rctpp(uid): # 来自int100 u = osu_user.Osuer(uid=uid) recent = u.get_recent(limit=1) if len(recent) == 0: return '这人最近没有打图!快去打图爆曲奇!!!' recent = recent[0] bid = recent['beatmap_id'] # now now_acc = mods.get_acc(recent['count300'], recent['count100'], recent['count50'], recent['countmiss']) now_res = mods.calcpp(bid, now_acc, int(recent['maxcombo']), mods.get_mods_name(recent['enabled_mods']), recent['countmiss']) # if fc fc_acc = mods.get_acc(recent['count300'], recent['count100'], recent['count50'], 0) fc_res = mods.calcpp(bid, fc_acc, -1, mods.get_mods_name(recent['enabled_mods'])) # if 98acc a98_res = mods.calcpp(bid, 98.0, -1, mods.get_mods_name(recent['enabled_mods'])) artist = "" title = "" modstr = "" if 'artist_unicode' in fc_res.keys(): artist = fc_res['artist_unicode'] else: artist = fc_res['artist'] if 'title_unicode' in fc_res.keys(): title = fc_res['title_unicode'] else: title = fc_res['title'] if not fc_res['mods_str'] == "NONE": modstr = "Mods: " + fc_res['mods_str'] + " " return '%s - %s [%s]\nBeatmap by %s\nhttps://osu.ppy.sh/b/%s\n%sRank: %s Star: %.2f*\n\n对比: (现在 / fc / 98%%)\n%.2f%% / %.2f%% / %.2f%%\n%.2fpp / %.2fpp / %.2fpp\n%sx / %sx / %sx' % \ (artist, title, fc_res['version'], fc_res['creator'], bid, \ modstr, recent['rank'],fc_res['stars'],\ now_acc, fc_acc, 98.00, now_res['pp'], fc_res['pp'], a98_res['pp'],\ now_res['combo'], fc_res['max_combo'], fc_res['max_combo'])
def uid_find_or_input(uid=None, qq=None, can_input=True, return_type=0, gid=None): # 是否允许读入uid if can_input and uid: return uid u = osu_user.Osuer() ret = u.get_user_from_db(qq, gid) if not ret: return 0 if return_type == 0: return ret['osuid'] elif return_type == 1: return ret['osuname'] elif return_type == 2: return ret['osuid'],ret['osuname']
def check2(uid): u = osu_user.Osuer(uid=uid) userinfo = u.get_user_info() bp = u.get_user_bp(limit=10) acc = float(userinfo['accuracy']) pc = float(userinfo['playcount']) tth = float( int(userinfo['count300']) + int(userinfo['count100']) + int(userinfo['count50'])) bpacc = bppp = 0 for r in bp: bppp += float(r['pp']) bpacc += float( mods.get_acc(r['count300'], r['count100'], r['count50'], r['countmiss'])) newpp, acc_c, bpacc_c, bppp_c, pc_c, tth_c = pp2(acc, bpacc, bppp, pc, tth) print(acc, bpacc, bppp, pc, tth) return "%s\n实际pp:%spp\n预测水平:%spp" % ( uid, round(float(userinfo['pp_raw']), 2), newpp)
def save_rec(uid, groupid, hid=1, limit=1): o = osu_user.Osuer() rec = o.get_recent(uid, limit=limit) if not rec: return '你想意念刚榜???' # 过滤bids bids = filter_rec(uid, rec) if not bids: logging.info('bids列表空!') return '你倒是打图啊.JPG' # 过滤rec newRec = autoRec(rec, bids) # 最新rec成绩优化 newRec = score.rec_highscore(newRec) # 提取rec inRec = score.check_rec(bids, newRec) if not inRec: logging.info('无新成绩!') return '你还要再刚一点.JPG' # 从库中过滤bids inbids = [r['beatmap_id'] for r in inRec] inbids = score.filter_beatmapid(inbids) logging.info('查询bids列表:%s' % str(inbids)) if inbids: mapsinfo = [o.get_beatmapinfo(b) for b in inbids] map_args = score.args_format('map', mapsinfo) score.map2db(map_args) rec_args = score.args_format('rec', inRec) score.rec2db(rec_args) rec1 = copy.deepcopy(inRec) rec2 = copy.deepcopy(inRec) # 总榜临时处理 score.map_rank(rec1, groupid, hid=1, rtype=1) score.map_rank(rec2, groupid, hid=1, rtype=2) return 'upload success!'
def get_rankinfo(uid, groupid, bid, hid=1, mod=-1): print('查询用户[%s]' % uid) ret = score.hid_ranks(bid, groupid, hid, mod) o = osu_user.Osuer() if not ret: return '榜上一个成绩都没有!!! https://osu.ppy.sh/b/%s' % bid ret = ret[0] outstr = '%s(%s)-%s[%s]\n' % (ret['source'], ret['artist'], ret['title'], ret['version']) uids = [] for i, r in enumerate(json.loads(ret['rankjson'])[:10]): for k, v in r.items(): uid = k uids.append(uid) sco = v m = ','.join(mods.getMod(int(sco[5]))) outstr += '#%s {%s} %s分 [%sx] %s%% %s +%s\n' % ( i + 1, uid, sco[0], sco[1], sco[3], sco[4], m) res = o.get_usernames_by_uid(uids) for r in res: restr = '{%s}' % r['osuid'] outstr = outstr.replace(restr, r['osuname']) return outstr[:-1]
def todaybp(uid): # 来自int100 u = osu_user.Osuer(uid=uid) bps = u.get_user_bp(limit=100) if len(bps) == 0: return '这人没有bp!!!' todaybp = [] today = int(time.strftime("%Y%m%d", time.localtime())) i = 1 for bp in bps: date = int( time.strftime( "%Y%m%d", time.localtime( time.mktime(time.strptime(bp['date'], "%Y-%m-%d %H:%M:%S"))))) if date == today: bp['num'] = i todaybp.append(bp) i = i + 1 if len(bp) == 0: return "你太菜了!一个bp都没更新!!" mtext = "%s today's bp:\n" % uid for bp in todaybp: acc = mods.get_acc(bp['count300'], bp['count100'], bp['count50'], bp['countmiss']) mod = mods.get_mods_name(bp['enabled_mods']) mtext = mtext + "bp%s,%.2fpp,%.2f%%,%s,+%s\n" % ( bp['num'], float(bp['pp']), acc, bp['rank'], mod) return mtext[:-1]
def map(uid): u = osu_user.Osuer() map_id, num = u.choiceMap(uid) if not map_id: return '本bot根本不想给你推荐图' return 'inter推荐给%s的图:https://osu.ppy.sh/b/%s 推荐指数:%s' % (uid, map_id, num)
def check(uid): u = osu_user.Osuer() pp, pp2, maxpp = u.check_user(uid) if not pp: return '你在逗我把,哪来的pp???' return '%s\npp:%spp\ninter手算:%spp\n目前潜力:%spp' % (uid, pp, pp2, maxpp)
def get_osuer_info(uid): u = osu_user.Osuer() return u.get_user_info(uid)
def get_user_stats(uid='8505303'): o = osu_user.Osuer() ret = o.get_user_stats_today(uid) if not ret: return {} return ret[0]
def test(uid): u = osu_user.Osuer(uid=uid) userinfo = u.get_user_info() bp = u.get_user_bp(limit=5) return healthCheck.health_check(userinfo, bp)
def drawR(mapjson, rankjson, userjson): # skin bg_e = draw_data.check_bg(mapjson['beatmap_id']) bg = '%s.jpg' % mapjson['beatmap_id'] if bg_e else 'newgame_background.png' back_icon = 'menu-back-0.png' mod_icon = 'selection-mode.png' mods_icon = 'selection-mods.png' random_icon = 'selection-random.png' options_icon = 'selection-options.png' rank_x = 'ranking-%s-small.png' # ous ui songselecttop = 'songselect-top.png' uptips = 'selection-update.png' osu_icon = 'menu-osu.png' songselect_bottom = 'songselect-bottom.png' level_bar = 'levelbar.png' level_bar_bg = 'levelbar-bg.png' selection_approved = 'selection-approved.png' # 用户信息 uname = userjson.get('username', '') pp = round(float(userjson.get('pp', 0)), 2) acc = userjson.get('acc', '') level = userjson.get('level', '99') rank = userjson.get('rank', '') umod = 'mode-osu-small.png' #曲子信息 title = mapjson.get('title', '') source = mapjson.get('source', '') artist = mapjson.get('artist', '') version = mapjson.get('version', '') creator = mapjson.get('creator', '') bpm = mapjson.get('bpm', '') max_combo = mapjson.get('max_combo', '') difficultyrating = round(float(mapjson.get('difficultyrating', '')), 2) #stars diff_size = mapjson.get('diff_size', '') #CS diff_approach = mapjson.get('diff_approach', '') #AR diff_overall = mapjson.get('diff_overall', '') #OD diff_drain = mapjson.get('diff_drain', '') #HP m, s = divmod(int(mapjson.get('total_length')), 60) h, m = divmod(m, 60) if h != 0: hit_length = "%02d:%02d:%02d" % (h, m, s) #sec else: hit_length = "%02d:%02d" % (m, s) #sec # 头像download uids = [list(r.keys())[0] for r in rankjson] check_uids = uids[:12] me = userjson.get('osuid', '') if me not in uids: check_uids.append(me) me_idx = -1 else: me_idx = uids.index(me) draw_data.check_img(check_uids) d = DrawRec() # 第一层bg d.add_items(isresize=True, path='image/bg/%s' % bg) # title黑层 d.add_items2(songselecttop) # 更新提示 # d.add_items2(uptips, 20, 200) # 低下大黑条 d.add_items2(songselect_bottom, 0, 648, isresize=True, width=1366, height=120) # 大粉饼 d.add_items2(osu_icon, 1130, 550, isresize=True, width=300, height=300) # 返回 d.add_items(back_icon, 10, 615) # mode d.add_items(mod_icon, 250, 678) # mods选择 d.add_items(mods_icon, 340, 678) # random d.add_items(random_icon, 430, 678) # options d.add_items(options_icon, 520, 678) # 头像 d.add_items(x=690, y=675, path='image/userimg/%s.jpg' % me, isresize=True, width=90, height=90) # 用户信息 d.add_items2(umod, 998, 670, factor=0.5) d.add_text(968, 710, '# %s' % rank, font_size=16, ttype='en') d.add_text(788, 670, uname, font_size=24, ttype='en') d.add_text(788, 700, 'Performance:%spp' % pp, font_size=16, ttype='en') d.add_text(788, 720, 'Accuracy:%s%%' % acc, font_size=16, ttype='en') d.add_text(788, 740, 'Lv:%s' % level, font_size=16, ttype='en') d.add_items2(level_bar, 840, 750, isresize=True, width=100, height=14) d.add_items2(level_bar_bg, 840, 750) # 曲子信息 d.add_text(40, 0, '%s (%s) - %s [%s]' % (source, artist, title, version), font_size=25, ttype='cn') d.add_items2(selection_approved, 7, 0) d.add_text(40, 26, '作者: %s' % (creator), font_size=16, ttype='cn') d.add_text(5, 45, '长度: %s BPM: %s 物件数: %s' % (hit_length, bpm, max_combo), font_size=18, ttype='cn') d.add_text( 5, 68, 'CS:%s AR:%s OD:%s HP:%s Stars:%s' % (diff_size, diff_approach, diff_overall, diff_drain, difficultyrating), font_size=14, ttype='en') # 榜区域 nums = len(uids) o = osu_user.Osuer() res = o.get_usernames_by_uid(uids) udict = {r['osuid']: r['osuname'] for r in res} if nums > 6: r1 = 6 r2 = nums - 6 else: r1 = nums r2 = 0 offset1 = 65 for i in range(r1): r = rankjson[i] u = uids[i] mds = int(r[u][5]) mds_l = mods.getMod(mds) m = ','.join(mds_l) if mds > 0 else '' rank = 'D' if r[u][4] == 'F' else r[u][4] d.draw_rectangle(x=20, y=160 + i * offset1, width=460, height=60, fill=(0, 0, 0, 50)) d.add_items(x=20, y=160 + i * offset1, path='image/userimg/%s.jpg' % u, isresize=True, width=60, height=60) d.add_items(rank_x % rank, 80, 170 + i * offset1) d.add_text(120, 160 + i * offset1, '%s' % (udict.get(u, 'None')), font_size=25, ttype='en') d.add_text(120, 190 + i * offset1, '得分: %s' % (format(int(r[u][0]), ',')), font_size=20, ttype='cn') d.add_text(300, 190 + i * offset1, '(%sx)' % (format(int(r[u][1]), ',')), font_size=20, ttype='en') d.add_text(450 - 20 * len(mds_l), 165 + i * offset1, '%s' % (m), font_size=20, ttype='en') d.add_text(400, 190 + i * offset1, '%s%%' % (r[u][3]), font_size=18, ttype='en') d.add_text(150, 550, '个人最佳成绩', font_size=24, ttype='cn') d.draw_rectangle(x=20, y=590, width=460, height=60, fill=(0, 0, 0, 50)) if me_idx != -1: r = rankjson[me_idx] u = uids[me_idx] mds = int(r[u][5]) mds_l = mods.getMod(mds) m = ','.join(mds_l) if mds > 0 else '' rank = 'D' if r[u][4] == 'F' else r[u][4] d.add_items(x=20, y=590, path='image/userimg/%s.jpg' % me, isresize=True, width=60, height=60) d.add_items(rank_x % rank, 80, 595) d.add_text(120, 590, '%s' % (udict[u]), font_size=25, ttype='en') d.add_text(120, 620, '得分: %s' % (format(int(r[u][0]), ',')), font_size=20, ttype='cn') d.add_text(300, 620, '(%sx)' % (format(int(r[u][1]), ',')), font_size=20, ttype='en') d.add_text(450 - 20 * len(mds_l), 600, '%s' % (m), font_size=20, ttype='en') d.add_text(410, 620, '%s%%' % (r[u][3]), font_size=18, ttype='en') else: d.add_text(130, 600, '你倒是快刚榜啊', font_size=25, ttype='cn') # copy for i in range(r2): if i == 6: break oi = i + 6 r = rankjson[oi] u = uids[oi] mds = int(r[u][5]) mds_l = mods.getMod(mds) m = ','.join(mds_l) if mds > 0 else '' rank = 'D' if r[u][4] == 'F' else r[u][4] d.draw_rectangle(x=620, y=160 + i * offset1, width=460, height=60, fill=(0, 0, 0, 50)) d.add_items(x=620, y=160 + i * offset1, path='image/userimg/%s.jpg' % u, isresize=True, width=60, height=60) d.add_items(rank_x % rank, 680, 170 + i * offset1) d.add_text(720, 160 + i * offset1, '%s' % (udict[u]), font_size=25, ttype='en') d.add_text(720, 190 + i * offset1, '得分: %s' % (format(int(r[u][0]), ',')), font_size=20, ttype='cn') d.add_text(900, 190 + i * offset1, '(%sx)' % (format(int(r[u][1]), ',')), font_size=20, ttype='en') d.add_text(1050 - 20 * len(mds_l), 165 + i * offset1, '%s' % (m), font_size=20, ttype='en') d.add_text(1010, 190 + i * offset1, '%s%%' % (r[u][3]), font_size=18, ttype='en') d.save('image/rank.png')