def __update_list_of_wgid(wgid: list, stattocheck: str) -> None: """Updates a list of WGID, maximum of 100""" wgapiresults = wotframework.player_data_info(wgid) wgapiresults = wgapiresults['data'] for wgapiresult in wgapiresults.items(): wgapiresult = wgapiresult[1] if wgapiresult is None: continue #Unknown user, skip (Banned, deleted user) userdbdata = CosmosFramework.query_cosmos_for_user_by_wgid( wgapiresult['account_id']) if userdbdata is None: continue #Not in database, This shouldn't happen if 'contest' in userdbdata: #Meaning I've seen user before stat = wgapiresult['statistics']['random'][stattocheck] userdbdata['contest']['points'].append(stat) if (int(stat) - int(userdbdata['contest']['points'][0]) != 0): userdbdata['contest']['currentscore'] = int(stat) - int( userdbdata['contest']['points'][0]) CosmosFramework.ReplaceItem(userdbdata['_self'], userdbdata) elif 'contest' not in userdbdata: stat = [wgapiresult['statistics']['random'][stattocheck]] points = {'points': stat} points['currentscore'] = 0 userdbdata['contest'] = dict(points) CosmosFramework.ReplaceItem(userdbdata['_self'], userdbdata)
def RunUpdate(): def get_responsible_clans(): results = CosmosFramework.QueryItems( "SELECT DISTINCT(c.wotclan) FROM c WHERE c.wotclan <> null", 'roles') returnlist = [] for result in results: returnlist.append(result['wotclan']) return returnlist familyclans = get_responsible_clans() results = CosmosFramework.QueryItems( "SELECT * FROM c WHERE c.wgid <> null AND c.server = 'NA'") users = {} userinfo = {} for result in results: userinfo.clear() userinfo['clan'] = result['clan'] userinfo['rank'] = result['rank'] #userinfo['wgid'] = result['wgid'] userinfo['discordid'] = result['discordid'] users[result['wgid']] = dict(userinfo) listofusers = [] wotresults = [] for user in users: if len(listofusers) < 99: listofusers.append(user) else: listofusers.append(user) wotresults += wotframework.GetPlayersClanInfo(listofusers) listofusers.clear() wotresults += wotframework.GetPlayersClanInfo(listofusers) for wotresult in wotresults: if wotresult[1] in familyclans: #check if they are in family if users[wotresult[0]]['clan'] != wotresult[1] or users[ wotresult[0]]['rank'] != wotresult[2]: results = CosmosFramework.QueryItems( "SELECT * FROM c WHERE c.wgid={0}".format(wotresult[0]), 'users') results = results[0] results['clan'] = wotresult[1] results['rank'] = wotresult[2] CosmosFramework.ReplaceItem(results['_self'], results) DiscordBotFramework.checkroles(results['discordid']) else: if users[wotresult[0]]['clan'] != wotresult[1] or users[ wotresult[0]]['rank'] != 'friend': results = CosmosFramework.QueryItems( "SELECT * FROM c WHERE c.wgid={0}".format(wotresult[0]), 'users') results = results[0] results['clan'] = wotresult[1] results['rank'] = 'friend' CosmosFramework.ReplaceItem(results['_self'], results) DiscordBotFramework.checkroles(results['discordid'])
def __start_new_contest(channelid: str) -> None: """Starts new contest by removing old contest results""" results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE IS_DEFINED(c.contest)') for result in results: del result['contest'] CosmosFramework.ReplaceItem(result['_self'], result) results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.start = true', 'contest') results = results[0] results['start'] = False results['active'] = True CosmosFramework.ReplaceItem(results['_self'], results) days = int((results['endtime'] - results['starttime']) / 86400) startmessage = 'Reddit World of Tanks contest has started! It will run for {0} days.'.format( days) startmessage += '\nContest is measurement of World of Tanks single stat in random battles from now until end of contest.' startmessage += '\nStat is chosen randomly and not available to any staff member.' startmessage += '\nContest is open to anyone with who has register with bot or registers with bot while contest is running. RDDT clan membership is not required.' DiscordFramework.SendDiscordMessage(message=startmessage, channelid=channelid)
def citadel(body: dict) -> dict: returnmessage = {} citadelroleid = 636372439261249566 citadelchannelid = 636374196355858452 result = __query_cosmos_for_info_by_discordid(str(body['authorid'])) discordserverid = CommonFramework.RetrieveConfigOptions('discord') discordserverid = discordserverid['serverid'] if result is None or 'wgid' not in result: returnmessage[ 'author'] = "You have not registered with the bot, this is mandatory. Please visit <#507725600073449482> to register or please complete registration." return returnmessage wgid = [int(result['wgid'])] claninfo = wotframework.GetPlayersClanInfo(wgid) claninfo = claninfo[0] if claninfo[1] is None: returnmessage[ 'author'] = "You are not a member of clan, citadel access is denied" return returnmessage elif claninfo[2] not in [ 'commander', 'executive_officer', 'combat_officer', 'personnel_officer' ]: returnmessage[ 'author'] = "Citadel access is restricted to Clan officers only" return returnmessage results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.wgid = {0}'.format(claninfo[1]), 'citadel') if bool(results): #Meaning their clan ID is in citadel container result = results[0] if result['citadel'] is True: DiscordFramework.AddUserRole(citadelroleid, body['authorid'], discordserverid) returnmessage['author'] = "Access granted" DiscordFramework.SendDiscordMessage( "{0} from {1} has joined the citadel.".format( body['authordisplayname'], result['name']), citadelchannelid) result = __query_cosmos_for_info_by_discordid(str( body['authorid'])) result['citadel'] = True CosmosFramework.ReplaceItem(result['_self'], result) else: returnmessage[ 'author'] = 'Citadel access has been revoked because: {0}. If you believe access should be granted, please see moderator.'.format( result['excludereason']) else: returnmessage[ 'author'] = 'Citadel access is restricted to clans who rank on Global Map ELO. If you believe access should be granted, please see moderator.' return returnmessage
def __exclude_wgid_from_citadel(wgid: int) -> None: """Removes WGID from citadel""" citadelroleid = 636372439261249566 discordserverid = CommonFramework.RetrieveConfigOptions('discord') discordserverid = discordserverid['serverid'] result = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.discordid="{0}"'.format(wgid), 'users') if bool(result): result = result[0] DiscordFramework.RemoveUserRole(citadelroleid, result['discordid'], discordserverid) DiscordFramework.send_discord_private_message( 'You have been removed from RDDT citadel due clan/rank changes', result['discordid']) del result['citadel'] CosmosFramework.ReplaceItem(result['_self'], result)
def __exclude_clan_from_citadel(clanid): citadelroleid = 636372439261249566 discordserverid = CommonFramework.RetrieveConfigOptions('discord') discordserverid = discordserverid['serverid'] results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.clan = {0} AND c.citadel = true'.format( clanid), 'users') for result in results: status_code = DiscordFramework.RemoveUserRole( citadelroleid, result['discordid'], discordserverid) if status_code == 204: del result['citadel'] CosmosFramework.ReplaceItem(result['_self'], result) else: DiscordFramework.send_discord_private_message( "Citadel checker is having issues", 113304266269003776) raise "Clan removal failed"
def CheckCones() -> None: def __remove_cone_role(discordid: str) -> int: ConeOfShameDiscordId = '525870180505747467' config = CommonFramework.RetrieveConfigOptions('discord') status_code = DiscordFramework.RemoveUserRole(ConeOfShameDiscordId, discordid, config['serverid']) return status_code currenttime = int(time.time()) results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.cone < {0}'.format(currenttime)) if bool(results): #meaning people to process for result in results: status_code = __remove_cone_role(result['discordid']) if status_code == 204: del result['cone'] CosmosFramework.ReplaceItem(result['_self'], result)
def __end_current_contest(channelid: str) -> None: contestresults = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.active = true', 'contest') contestresults = contestresults[0] winnerresults = CosmosFramework.QueryItems( 'SELECT TOP 10 * FROM c WHERE IS_DEFINED(c.contest.currentscore) AND c.contest.currentscore != 0 ORDER BY c.contest.currentscore DESC', 'users') message = 'Contest is over, congratulations to the winners. Stat being tracked this contest was: {0}. Rewards will be issued shortly.'.format( contestresults['stat']) DiscordFramework.SendDiscordMessage(message=message, channelid=channelid) placedict = {} place = 1 for result in winnerresults: placedict[str(place)] = { result['wgid']: result['contest']['currentscore'] } place += 1 contestresults['winners'] = dict(placedict) contestresults['active'] = False CosmosFramework.ReplaceItem(contestresults['_self'], contestresults)
def cone(body: dict) -> dict: """Cones user, adds information to database and sends return messages""" discordmessage = body['message'].split() ConeOfShameDiscordId = '525870180505747467' returnmessage = {} config = CommonFramework.RetrieveConfigOptions('discord') try: if len(discordmessage) < 3: returnmessage['author'] = 'Invalid command format' return returnmessage timetocone = int(discordmessage[2]) if timetocone > 2880: returnmessage[ 'author'] = 'You cannot Cone someone longer then 2 days' return returnmessage discordid = int(__discord_id_from_mention( discordmessage[1])) ##Trys int to make sure it's int result = __query_cosmos_for_info_by_discordid(discordid) if result is None: newitem = {} newitem['discordid'] = str(discordid) result = CosmosFramework.InsertItem(newitem, 'users') if 'cone' in result: returnmessage['author'] = 'User is already coned' statuscode = DiscordFramework.AddUserRole(ConeOfShameDiscordId, discordid, config['serverid']) if statuscode == 204: #Meaning add role was successful result['cone'] = int(time.time()) + (60 * int(timetocone)) CosmosFramework.ReplaceItem(result['_self'], result) returnmessage['channel'] = '{0} muted user for {1} minutes'.format( body['authordisplayname'], timetocone) returnmessage['author'] = 'Cone issued as requested' returnmessage['targetdiscordid'] = discordid returnmessage[ 'target'] = 'You were muted for {0} minutes by {1}'.format( timetocone, body['authordisplayname']) except Exception as e: returnmessage['author'] = 'Following error has occured: {0}'.format(e) return returnmessage
def respond_to_login(resp): url = resp.identity_url pattern = re.compile('\d{10}') wgid = pattern.search(url).group() token = session['token'] print('User logged in with wgid {} and token {}.'.format(wgid, token)) #Wargaming id is now wgid #Token passed in is now token #Starting Processing Code Block response_message = "Beginning processing<br/>" if len(token) != 8: #Greater then 8, someone is f*****g with me response_message += "Token rejected <br/>" elif token == "00000000": response_message += "Token invalid. If you think this is incorrect, contact an Administrator <br/>" else: results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.wgtoken = "{0}"'.format(token), 'users') wgidcheck = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.wgid={0}'.format(wgid), 'users') if not bool(results): response_message += "Unknown token" elif bool(wgidcheck): response_message += "You are already registered with the bot, please contact Rabbit for further assistance" else: results = results[0] results['wgid'] = int(wgid) results['server'] = 'NA' results['clan'] = None results['rank'] = None results['wgtoken'] = '00000000' CosmosFramework.ReplaceItem(results['_self'], results) response_message += "You have been added to database. Updater will process you in 15 minutes or less." #End Processing code block return '{} <br/><br/> Debug Info: WGID: {}, Token: {}'.format( response_message, wgid, token)
def run_citadel_check(): def __get_citadel_results() -> dict: primary = {} secondary = {} results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.citadel = true', 'citadel') for result in results: secondary['tag'] = result.get('tag') secondary['name'] = result.get('name') secondary['citadel'] = result.get('citadel') secondary['override'] = result.get('citadeloverride') secondary['excludereason'] = result.get('excludereason') secondary['excludetime'] = result.get('excludetime') primary[result['wgid']] = dict(secondary) secondary.clear() return primary def __exclude_clan_from_citadel(clanid): citadelroleid = 636372439261249566 discordserverid = CommonFramework.RetrieveConfigOptions('discord') discordserverid = discordserverid['serverid'] results = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.clan = {0} AND c.citadel = true'.format( clanid), 'users') for result in results: status_code = DiscordFramework.RemoveUserRole( citadelroleid, result['discordid'], discordserverid) if status_code == 204: del result['citadel'] CosmosFramework.ReplaceItem(result['_self'], result) else: DiscordFramework.send_discord_private_message( "Citadel checker is having issues", 113304266269003776) raise "Clan removal failed" def __exclude_wgid_from_citadel(wgid: int) -> None: """Removes WGID from citadel""" citadelroleid = 636372439261249566 discordserverid = CommonFramework.RetrieveConfigOptions('discord') discordserverid = discordserverid['serverid'] result = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.discordid="{0}"'.format(wgid), 'users') if bool(result): result = result[0] DiscordFramework.RemoveUserRole(citadelroleid, result['discordid'], discordserverid) DiscordFramework.send_discord_private_message( 'You have been removed from RDDT citadel due clan/rank changes', result['discordid']) del result['citadel'] CosmosFramework.ReplaceItem(result['_self'], result) citadelchannelid = 636374196355858452 #Actual citadel channel wgapi = CommonFramework.RetrieveConfigOptions('wargaming') results = __get_citadel_results() apiresults = CommonFramework.get_json_data( "https://api.worldoftanks.com/wot/clanratings/top/?application_id={0}&rank_field=gm_elo_rating&limit=200" .format(wgapi['apitoken'])) wgidlist = [] #Do clan checks ##TODO put this in it's own def block for apiresult in apiresults[ 'data']: #Get information about clans from Wargaming API wgidlist.append(apiresult['clan_id']) if apiresult['clan_id'] not in results: item = {} item['wgid'] = apiresult['clan_id'] item['name'] = apiresult['clan_name'] item['tag'] = apiresult['clan_tag'] item['citadel'] = True CosmosFramework.InsertItem(item, 'citadel') elif apiresult['clan_id'] in results and ( results[apiresult['clan_id']]['tag'] != apiresult['clan_tag'] or results[apiresult['clan_id']]['name'] != apiresult['clan_name']): #Checks the database and Wargaming API match around clan tag and name, if not, it updates it updateitem = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.wgid={0}'.format( apiresult['clan_id']), 'citadel') updateitem = updateitem[0] updateitem['name'] = apiresult['clan_name'] updateitem['tag'] = apiresult['clan_tag'] CosmosFramework.ReplaceItem(updateitem['_self'], updateitem) clanlist = list(results.keys()) removeclans = list(set(clanlist) - set(wgidlist)) #List of clans to be removed for removeclan in removeclans: claninfo = CosmosFramework.QueryItems( 'SELECT * FROM c WHERE c.wgid={0}'.format(removeclan), 'citadel') claninfo = claninfo[0] if 'override' in claninfo and claninfo['override'] is True: continue #Overrides are not removed elif 'excludetime' not in claninfo: #Step 2, put in removal time claninfo['excludetime'] = int(time.time( )) + 604700 #This is 6 days, 23 hours and ~58 minutes message = "WARNING: Clan {0} ({1}) will be removed within 7 days due to lack of clan rating.".format( claninfo['name'], claninfo['tag']) DiscordFramework.SendDiscordMessage(message, citadelchannelid) CosmosFramework.ReplaceItem(claninfo['_self'], claninfo) elif claninfo['excludetime'] < int( time.time() ): #when their time is hit, mark them no longer allowed in citadel with reason and remove all clan members __exclude_clan_from_citadel(removeclan) message = "Clan {0} ({1}) has been removed from citadel.".format( claninfo['name'], claninfo['tag']) DiscordFramework.SendDiscordMessage(message, citadelchannelid) claninfo['citadel'] = False claninfo['excludetime'] = None claninfo['excludereason'] = 'Excluded due to lack of ranking' CosmosFramework.ReplaceItem(claninfo['_self'], claninfo) #Do user checks ##TODO Put this in it's own def block userresults = CosmosFramework.QueryItems( 'SELECT c.wgid FROM c WHERE c.citadel = true', 'users') wgidtocheck = [] for userresult in userresults: wgidtocheck.append(userresult['wgid']) if len(wgidtocheck) >= 99: apiresults = wotframework.GetPlayersClanInfo(wgidtocheck) for apiresult in apiresults: if apiresult[1] is None or apiresult[2] not in [ 'commander', 'executive_officer', 'combat_officer', 'personnel_officer' ]: __exclude_wgid_from_citadel(apiresult[0]) wgidtocheck.clear()