async def updateRoles(client=None, member=None): user_data = EwUser(member=member) roles_map = ewutils.getRoleMap(member.server.roles) roles_map_user = ewutils.getRoleMap(member.roles) if user_data.life_state != ewcfg.life_state_kingpin and ewcfg.role_kingpin in roles_map_user: # Fix the life_state of kingpins, if somehow it wasn't set. user_data.life_state = ewcfg.life_state_kingpin user_data.persist() elif user_data.life_state != ewcfg.life_state_grandfoe and ewcfg.role_grandfoe in roles_map_user: # Fix the life_state of a grand foe. user_data.life_state = ewcfg.life_state_grandfoe user_data.persist() faction_roles_remove = [ ewcfg.role_juvenile, ewcfg.role_juvenile_pvp, ewcfg.role_rowdyfuckers, ewcfg.role_rowdyfuckers_pvp, ewcfg.role_copkillers, ewcfg.role_copkillers_pvp, ewcfg.role_corpse, ewcfg.role_corpse_pvp, ewcfg.role_kingpin, ewcfg.role_grandfoe ] # Manage faction roles. faction_role = ewutils.get_faction(user_data=user_data) faction_roles_remove.remove(faction_role) # Manage location roles. poi_role = None poi = ewcfg.id_to_poi.get(user_data.poi) if poi != None: poi_role = poi.role poi_roles_remove = [] for poi in ewcfg.poi_list: if poi.role != None and poi.role != poi_role: poi_roles_remove.append(poi.role) role_names = [] for roleName in roles_map_user: if roleName not in faction_roles_remove and roleName not in poi_roles_remove: role_names.append(roleName) if faction_role not in role_names: role_names.append(faction_role) if poi_role != None and poi_role not in role_names: role_names.append(poi_role) replacement_roles = [] for name in role_names: role = roles_map.get(name) if role != None: replacement_roles.append(role) else: ewutils.logMsg("error: role missing \"{}\"".format(name)) await client.replace_roles(member, *replacement_roles)
async def banish(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state != ewcfg.life_state_kingpin: response = "Only the Rowdy F****r {} and the Cop Killer {} can do that.".format( ewcfg.emote_rowdyfucker, ewcfg.emote_copkiller) else: member = None if cmd.mentions_count == 1: member = cmd.mentions[0] if member.id == cmd.message.author.id: member = None if member == None: response = "Who?" else: member_data = EwUser(member=member) member_data.ban(faction=user_data.faction) member_data.unvouch(faction=user_data.faction) if member_data.faction == user_data.faction: member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile member_data.persist() response = "{} has been banned from enlisting in the {}".format( member.display_name, user_data.faction) await ewrolemgr.updateRoles(client=cmd.client, member=member) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def shamble(cmd): user_data = EwUser(member = cmd.message.author) if user_data.life_state != ewcfg.life_state_shambler and user_data.poi != ewcfg.poi_id_assaultflatsbeach: response = "You have too many higher brain functions left to {}.".format(cmd.tokens[0]) return await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.life_state in [ewcfg.life_state_juvenile, ewcfg.life_state_enlisted] and user_data.poi == ewcfg.poi_id_assaultflatsbeach: response = "You feel an overwhelming sympathy for the plight of the Shamblers and decide to join their ranks." await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) await asyncio.sleep(5) user_data = EwUser(member=cmd.message.author) user_data.life_state = ewcfg.life_state_shambler user_data.degradation = 100 ewutils.moves_active[user_data.id_user] = 0 user_data.poi = ewcfg.poi_id_nuclear_beach_edge user_data.persist() member = cmd.message.author base_poi_channel = ewutils.get_channel(cmd.message.guild, 'nuclear-beach-edge') response = 'You arrive inside the facility and are injected with a unique strain of the Modelovirus. Not long after, a voice on the intercom chimes in.\n**"Welcome, {}. Welcome to Downpour Laboratories. It\'s safer here. Please treat all machines and facilities with respect, they are precious to our cause."**'.format(member.display_name) await ewrolemgr.updateRoles(client=cmd.client, member=member) return await ewutils.send_message(cmd.client, base_poi_channel, ewutils.formatMessage(cmd.message.author, response)) else: pass
async def pardon(cmd): response = "" user_data = EwUser(member=cmd.message.author) if user_data.life_state != ewcfg.life_state_kingpin: response = "Only the Rowdy F****r {} and the Cop Killer {} can do that.".format( ewcfg.emote_rowdyfucker, ewcfg.emote_copkiller) else: member = None if cmd.mentions_count == 1: member = cmd.mentions[0] if member.id == cmd.message.author.id: member = None if member == None: response = "Who?" else: member_data = EwUser(member=member) if member_data.faction == "": response = "{} isn't enlisted.".format(member.display_name) else: faction_old = member_data.faction member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile member_data.persist() response = "{} has been released from his association with the {}.".format( member.display_name, faction_old) await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def banish(cmd): user_data = EwUser(member = cmd.message.author) if user_data.life_state != ewcfg.life_state_kingpin and user_data.life_state != ewcfg.life_state_executive and not cmd.message.author.guild_permissions.administrator: response = "Only the Rowdy F****r {}, the Cop Killer {} and Slimecorp Executives {} can do that.".format(ewcfg.emote_rowdyfucker, ewcfg.emote_copkiller, ewcfg.emote_slimecorp) else: member = None if cmd.mentions_count == 1: member = cmd.mentions[0] # >:] # if member.id == cmd.message.author.id: # member = None if member == None: response = "Who?" else: member_data = EwUser(member = member) member_data.ban(faction = user_data.faction) member_data.unvouch(faction = user_data.faction) if member_data.faction == user_data.faction: member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile member_poi = ewcfg.id_to_poi.get(member_data.poi) if ewmap.inaccessible(user_data = member_data, poi = member_poi): member_data.poi = ewcfg.poi_id_downtown member_data.persist() response = "{} has been banned from enlisting in the {}".format(member.display_name, user_data.faction) await ewrolemgr.updateRoles(client = cmd.client, member = member) await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def renounce(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state == ewcfg.life_state_corpse: response = "You're dead, bitch." return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.life_state != ewcfg.life_state_enlisted: response = "What exactly are you renouncing? Your lackadaisical, idyllic life free of vice and violence? You aren't actually currently enlisted in any gang, retard." elif user_data.poi not in [ ewcfg.poi_id_rowdyroughhouse, ewcfg.poi_id_copkilltown ]: response = "To turn in your badge, you must return to your soon-to-be former gang base." else: renounce_fee = int(user_data.slimes) / 2 user_data.change_slimes(n=-renounce_fee) faction = user_data.faction user_data.life_state = ewcfg.life_state_juvenile user_data.weapon = -1 user_data.persist() response = "You are no longer enlisted in the {}, but you are not free of association with them. Your former teammates immediately begin to beat the shit out of you, knocking {} slime out of you before you're able to get away.".format( faction, renounce_fee) await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def rejuvenate(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state == ewcfg.life_state_shambler and user_data.poi != ewcfg.poi_id_oozegardens: response = "You lack the higher brain functions required to {}.".format(cmd.tokens[0]) return await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.life_state == ewcfg.life_state_shambler and user_data.poi == ewcfg.poi_id_oozegardens: response = "You decide to change your ways and become one of the Garden Gankers in order to overthrow your old master." await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) await asyncio.sleep(5) user_data = EwUser(member=cmd.message.author) user_data.life_state = ewcfg.life_state_juvenile user_data.degradation = 0 #user_data.gvs_currency = 0 ewutils.moves_active[user_data.id_user] = 0 user_data.poi = ewcfg.poi_id_og_farms user_data.persist() client = ewutils.get_client() server = client.get_guild(user_data.id_server) member = server.get_member(user_data.id_user) base_poi_channel = ewutils.get_channel(cmd.message.guild, ewcfg.channel_og_farms) response = "You enter into Atomic Forest inside the farms of Ooze Gardens and are sterilized of the Modelovirus. Hortisolis gives you a big hug and says he's glad you've overcome your desire for vengeance in pursuit of deposing Downpour." await ewrolemgr.updateRoles(client=cmd.client, member=member) return await ewutils.send_message(cmd.client, base_poi_channel, ewutils.formatMessage(cmd.message.author, response)) else: pass
async def enlist(cmd): time_now = int(time.time()) response = "" user_data = EwUser(member=cmd.message.author) if user_data.life_state == ewcfg.life_state_grandfoe: return if user_data.life_state == ewcfg.life_state_juvenile: faction = "" if cmd.tokens_count > 1: faction = cmd.tokens[1].lower() user_slimes = user_data.slimes if user_slimes < ewcfg.slimes_toenlist: response = "You need to mine more slime to rise above your lowly station. ({}/{})".format( user_slimes, ewcfg.slimes_toenlist) else: if faction == "": faction = user_data.faction if faction == ewcfg.faction_rowdys or faction == ewcfg.faction_killers: if len(user_data.faction) > 0 and user_data.faction != faction: # Disallow joining a new faction. Player must be pardoned first. response = "Disgusting traitor. You can only join the {}.".format( user_data.faction) else: response = "Enlisting in the {}.".format(faction) user_data.life_state = ewcfg.life_state_enlisted user_data.faction = faction user_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) else: response = "Which faction? Say '{} {}' or '{} {}'.".format( ewcfg.cmd_enlist, ewcfg.faction_killers, ewcfg.cmd_enlist, ewcfg.faction_rowdys) elif user_data.life_state == ewcfg.life_state_corpse: response = 'You are dead, bitch.' else: response = "You can't do that right now, bitch." # Send the response to the player. await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def promote(cmd): author = cmd.message.author if not author.server_permissions.administrator: return if cmd.mentions_count == 1: member = cmd.mentions[0] user_data = EwUser(member=member) user_data.life_state = ewcfg.life_state_executive user_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=member)
async def pardon(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state != ewcfg.life_state_kingpin and user_data.life_state != ewcfg.life_state_executive and not cmd.message.author.guild_permissions.administrator: response = "Only the Rowdy F****r {} and the Cop Killer {} can do that.".format( ewcfg.emote_rowdyfucker, ewcfg.emote_copkiller, ewcfg.emote_slimecorp) else: member = None if cmd.mentions_count == 1: member = cmd.mentions[0] if member.id == cmd.message.author.id: member = None if member == None: response = "Who?" else: member_data = EwUser(member=member) member_data.unban(faction=user_data.faction) if member_data.faction == "": response = "{} has been allowed to join the {} again.".format( member.display_name, user_data.faction) else: faction_old = member_data.faction member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile member_data.weapon = -1 response = "{} has been released from their association with the {}.".format( member.display_name, faction_old) member_poi = ewcfg.id_to_poi.get(member_data.poi) if ewmap.inaccessible(user_data=member_data, poi=member_poi): member_data.poi = ewcfg.poi_id_downtown member_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=member) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def begin_tutorial(member): user_data = EwUser(member = member) user_to_tutorial_state[user_data.id_user] = 0 scene = ewcfg.dungeon_tutorial[0] if scene.poi != None: user_data.poi = scene.poi if scene.life_state != None: user_data.life_state = scene.life_state user_data.persist() await ewrolemgr.updateRoles(client = ewutils.get_client(), member = member) response = format_tutorial_response(scene) poi_def = ewcfg.id_to_poi.get(user_data.poi) channels = [poi_def.channel] return await ewutils.post_in_channels(member.guild.id, ewutils.formatMessage(member, response), channels)
async def pardon(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state != ewcfg.life_state_kingpin: response = "Only the Rowdy F****r {} and the Cop Killer {} can do that.".format( ewcfg.emote_rowdyfucker, ewcfg.emote_copkiller) else: member = None if cmd.mentions_count == 1: member = cmd.mentions[0] if member.id == cmd.message.author.id: member = None if member == None: response = "Who?" else: member_data = EwUser(member=member) member_data.unban(faction=user_data.faction) if member_data.faction == "": response = "{} has been allowed to join the {} again.".format( member.display_name, user_data.faction) else: faction_old = member_data.faction member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile response = "{} has been released from their association with the {}.".format( member.display_name, faction_old) member_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=member) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def pardon(cmd): user_data = EwUser(member=cmd.message.author) if cmd.mentions_count == 1: member = cmd.mentions[0] if member.id == cmd.message.author.id: member = None if member == None: response = "Who?" else: member_data = EwUser(member=member) member_data.unban(faction=user_data.faction) if member_data.faction == "": response = "{} has been allowed to join the {} again.".format( member.display_name, user_data.faction) else: faction_old = member_data.faction member_data.faction = "" if member_data.life_state == ewcfg.life_state_enlisted: member_data.life_state = ewcfg.life_state_juvenile member_data.weapon = -1 response = "{} has been released from their association with the {}.".format( member.display_name, faction_old) member_poi = ewcfg.id_to_poi.get(member_data.poi) if ewmap.inaccessible(user_data=member_data, poi=member_poi): member_data.poi = ewcfg.poi_id_downtown member_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=member) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def revive(cmd): time_now = int(time.time()) response = "" if cmd.message.channel.name != ewcfg.channel_endlesswar and cmd.message.channel.name != ewcfg.channel_sewers: response = "Come to me. I hunger. #{}.".format(ewcfg.channel_sewers) else: player_data = EwUser(member=cmd.message.author) time_until_revive = (player_data.time_lastdeath + player_data.degradation) - time_now if time_until_revive > 0: response = "ENDLESS WAR is not ready to {} you yet ({}s).".format( cmd.tokens[0], time_until_revive) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) slimeoid = EwSlimeoid(member=cmd.message.author) if player_data.life_state == ewcfg.life_state_corpse: market_data = EwMarket(id_server=cmd.message.server.id) # Endless War collects his fee. #fee = (player_data.slimecoin / 10) #player_data.change_slimecoin(n = -fee, coinsource = ewcfg.coinsource_revival) #market_data.slimes_revivefee += fee #player_data.busted = False # Preserve negaslime if player_data.slimes < 0: #market_data.negaslime += player_data.slimes player_data.change_slimes(n=-player_data.slimes) # set to 0 # reset slimelevel to zero player_data.slimelevel = 0 # Set time of last revive. This used to provied spawn protection, but currently isn't used. player_data.time_lastrevive = time_now if player_data.degradation >= 100: player_data.life_state = ewcfg.life_state_shambler player_data.change_slimes(n=0.5 * ewcfg.slimes_shambler) player_data.trauma = "" poi_death = ewcfg.id_to_poi.get(player_data.poi_death) if ewmap.inaccessible(poi=poi_death, user_data=player_data): player_data.poi = ewcfg.poi_id_downtown else: player_data.poi = poi_death.id_poi else: # Set life state. This is what determines whether the player is actually alive. player_data.life_state = ewcfg.life_state_juvenile # Give player some initial slimes. player_data.change_slimes(n=ewcfg.slimes_onrevive) # Get the player out of the sewers. player_data.poi = ewcfg.poi_id_downtown player_data.persist() market_data.persist() # Shower every district in the city with slime from the sewers. sewer_data = EwDistrict(district=ewcfg.poi_id_thesewers, id_server=cmd.message.server.id) # the amount of slime showered is divided equally amongst the districts districts_amount = len(ewcfg.capturable_districts) geyser_amount = int(0.5 * sewer_data.slimes / districts_amount) # Get a list of all the districts for poi in ewcfg.capturable_districts: district_data = EwDistrict(district=poi, id_server=cmd.message.server.id) district_data.change_slimes(n=geyser_amount) sewer_data.change_slimes(n=-1 * geyser_amount) district_data.persist() sewer_data.persist() sewer_inv = ewitem.inventory(id_user=sewer_data.name, id_server=sewer_data.id_server) for item in sewer_inv: district = ewcfg.poi_id_slimesea if random.random() < 0.5: district = random.choice(ewcfg.capturable_districts) ewitem.give_item(id_item=item.get("id_item"), id_user=district, id_server=sewer_data.id_server) await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) response = '{slime4} Geysers of fresh slime erupt from every manhole in the city, showering their surrounding districts. {slime4} {name} has been reborn in slime. {slime4}'.format( slime4=ewcfg.emote_slime4, name=cmd.message.author.display_name) else: response = 'You\'re not dead just yet.' # deathreport = "You were {} by {}. {}".format(kill_descriptor, cmd.message.author.display_name, ewcfg.emote_slimeskull) # deathreport = "{} ".format(ewcfg.emote_slimeskull) + ewutils.formatMessage(member, deathreport) if slimeoid.life_state == ewcfg.slimeoid_state_active: reunite = "" brain = ewcfg.brain_map.get(slimeoid.ai) reunite += brain.str_revive.format(slimeoid_name=slimeoid.name) new_poi = ewcfg.id_to_poi.get(player_data.poi) revivechannel = ewutils.get_channel(cmd.message.server, new_poi.channel) reunite = ewutils.formatMessage(cmd.message.author, reunite) await ewutils.send_message(cmd.client, revivechannel, reunite) # Send the response to the player. await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def enlist(cmd): user_data = EwUser(member=cmd.message.author) user_slimes = user_data.slimes time_now = int(time.time()) bans = user_data.get_bans() vouchers = user_data.get_vouchers() if user_data.life_state == ewcfg.life_state_corpse: response = "You're dead, bitch." return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_slimes < ewcfg.slimes_toenlist: response = "You need to mine more slime to rise above your lowly station. ({}/{})".format( user_slimes, ewcfg.slimes_toenlist) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if cmd.tokens_count > 1: desired_faction = cmd.tokens[1].lower() else: response = "Which faction? Say '{} {}' or '{} {}'.".format( ewcfg.cmd_enlist, ewcfg.faction_killers, ewcfg.cmd_enlist, ewcfg.faction_rowdys) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if desired_faction == ewcfg.faction_killers: if ewcfg.faction_killers in bans: response = "You are banned from enlisting in the {}.".format( ewcfg.faction_killers) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif ewcfg.faction_killers not in vouchers and user_data.faction != ewcfg.faction_killers: response = "You need a current gang member's permission to join the {}.".format( ewcfg.faction_killers) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_killers: response = "You are already enlisted in the {}! Look, your name is purple! Get a clue, idiot.".format( user_data.faction) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.faction == ewcfg.faction_rowdys: response = "Traitor! You can only {} in the {}, you treacherous cretin. Ask for a {} if you're that weak-willed.".format( ewcfg.cmd_enlist, user_data.faction, ewcfg.cmd_pardon) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) else: response = "Enlisting in the {}.".format(ewcfg.faction_killers) user_data.life_state = ewcfg.life_state_enlisted user_data.faction = ewcfg.faction_killers user_data.time_lastenlist = time_now + ewcfg.cd_enlist user_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) elif desired_faction == ewcfg.faction_rowdys: if ewcfg.faction_rowdys in bans: response = "You are banned from enlisting in the {}.".format( ewcfg.faction_rowdys) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if ewcfg.faction_rowdys not in vouchers and user_data.faction != ewcfg.faction_rowdys: response = "You need a current gang member's permission to join the {}.".format( ewcfg.faction_rowdys) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_rowdys: response = "You are already enlisted in the {}! Look, your name is pink! Get a clue, idiot.".format( user_data.faction) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) elif user_data.faction == ewcfg.faction_killers: response = "Traitor! You can only {} in the {}, you treacherous cretin. Ask for a {} if you're that weak-willed.".format( ewcfg.cmd_enlist, user_data.faction, ewcfg.cmd_pardon) return await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) else: response = "Enlisting in the {}.".format(ewcfg.faction_rowdys) user_data.life_state = ewcfg.life_state_enlisted user_data.faction = ewcfg.faction_rowdys user_data.time_lastenlist = time_now + ewcfg.cd_enlist user_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) else: response = "That's not a valid gang you can enlist in, bitch." # Send the response to the player. await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def revive(cmd): time_now = int(time.time()) response = "" if cmd.message.channel.name != ewcfg.channel_endlesswar and cmd.message.channel.name != ewcfg.channel_sewers: response = "Come to me. I hunger. #{}.".format(ewcfg.channel_sewers) else: player_data = EwUser(member = cmd.message.author) slimeoid = EwSlimeoid(member = cmd.message.author) if player_data.life_state == ewcfg.life_state_corpse: market_data = EwMarket(id_server = cmd.message.server.id) # Endless War collects his fee. fee = (player_data.slimecredit / 10) player_data.change_slimecredit(n = -fee, coinsource = ewcfg.coinsource_revival) market_data.slimes_revivefee += fee player_data.busted = False # Preserve negaslime if player_data.slimes < 0: market_data.negaslime += player_data.slimes player_data.change_slimes(n = -player_data.slimes) # set to 0 # Give player some initial slimes. player_data.slimelevel = 0 player_data.change_slimes(n = ewcfg.slimes_onrevive) # Set time of last revive. This used to provied spawn protection, but currently isn't used. player_data.time_lastrevive = time_now # Set life state. This is what determines whether the player is actually alive. player_data.life_state = ewcfg.life_state_juvenile # Get the player out of the sewers. Will be endless-war eventually. player_data.poi = ewcfg.poi_id_downtown player_data.persist() market_data.persist() # Give some slimes to every living player (currently online) for member in cmd.message.server.members: if member.id != cmd.message.author.id and member.id != cmd.client.user.id: member_data = EwUser(member = member) if member_data.life_state != ewcfg.life_state_corpse and member_data.life_state != ewcfg.life_state_grandfoe: member_data.change_slimes(n = ewcfg.slimes_onrevive_everyone) member_data.persist() await ewrolemgr.updateRoles(client = cmd.client, member = cmd.message.author) response = '{slime4} A geyser of fresh slime erupts, showering Rowdy, Killer, and Juvenile alike. {slime4} {name} has been reborn in slime. {slime4}'.format(slime4 = ewcfg.emote_slime4, name = cmd.message.author.display_name) else: response = 'You\'re not dead just yet.' # deathreport = "You were {} by {}. {}".format(kill_descriptor, cmd.message.author.display_name, ewcfg.emote_slimeskull) # deathreport = "{} ".format(ewcfg.emote_slimeskull) + ewutils.formatMessage(member, deathreport) if slimeoid.life_state == ewcfg.slimeoid_state_active: reunite = "" brain = ewcfg.brain_map.get(slimeoid.ai) reunite += brain.str_revive.format( slimeoid_name = slimeoid.name ) downtownchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_downtown) reunite = ewutils.formatMessage(cmd.message.author, reunite) await cmd.client.send_message(downtownchannel, reunite) # Send the response to the player. await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def updateRoles(client=None, member=None, server_default=None, refresh_perms=True, remove_or_apply_flag=None): time_now = int(time.time()) if server_default != None: user_data = EwUser(id_user=member.id, id_server=server_default) else: user_data = EwUser(member=member) id_server = user_data.id_server if member == None: return ewutils.logMsg("error: member was not supplied for updateRoles") #roles_map = ewutils.getRoleMap(member.guild.roles) roles_map_user = ewutils.getRoleIdMap(member.roles) user_poi = ewcfg.id_to_poi.get(user_data.poi) if user_data.life_state != ewcfg.life_state_kingpin and ewcfg.role_kingpin in roles_map_user: # Fix the life_state of kingpins, if somehow it wasn't set. user_data.life_state = ewcfg.life_state_kingpin user_data.persist() elif user_data.life_state != ewcfg.life_state_grandfoe and ewcfg.role_grandfoe in roles_map_user: # Fix the life_state of a grand foe. user_data.life_state = ewcfg.life_state_grandfoe user_data.persist() faction_roles_remove = [ ewcfg.role_juvenile, ewcfg.role_juvenile_active, ewcfg.role_juvenile_pvp, ewcfg.role_rowdyfuckers, ewcfg.role_rowdyfuckers_pvp, ewcfg.role_rowdyfuckers_active, ewcfg.role_slimecorp, ewcfg.role_slimecorp_pvp, ewcfg.role_slimecorp_active, ewcfg.role_copkillers, ewcfg.role_copkillers_pvp, ewcfg.role_copkillers_active, ewcfg.role_corpse, ewcfg.role_corpse_pvp, ewcfg.role_corpse_active, ewcfg.role_kingpin, ewcfg.role_grandfoe, ewcfg.role_executive, ewcfg.role_tutorial, ewcfg.role_shambler, ] # Manage faction roles. faction_role = ewutils.get_faction(user_data=user_data) faction_roles_remove.remove(faction_role) non_wanted_pois = [ ewcfg.poi_id_copkilltown, ewcfg.poi_id_rowdyroughhouse, ewcfg.poi_id_juviesrow, ewcfg.poi_id_thebreakroom, ewcfg.poi_id_mine, ewcfg.poi_id_mine_bubble, ewcfg.poi_id_mine_sweeper, ewcfg.poi_id_juviesrow_pier, ewcfg.poi_id_jr_farms ] pvp_role = None active_role = None if faction_role in ewcfg.role_to_pvp_role: if not user_poi.is_apartment and \ user_poi.id_poi not in non_wanted_pois and \ (user_data.life_state != ewcfg.life_state_juvenile or user_data.slimelevel > ewcfg.max_safe_level): pvp_role = ewcfg.role_to_pvp_role.get(faction_role) faction_roles_remove.remove(pvp_role) # if ewutils.is_otp(user_data): # active_role = ewcfg.role_to_active_role.get(faction_role) # faction_roles_remove.remove(active_role) tutorial_role = None if user_data.poi in ewcfg.tutorial_pois: tutorial_role = ewcfg.role_tutorial faction_roles_remove.remove(tutorial_role) # Manage location roles. if user_poi != None: # poi_role = user_poi.role poi_major_role = user_poi.major_role poi_minor_role = user_poi.minor_role poi_permissions = user_poi.permissions else: # poi_role = None poi_major_role = None poi_minor_role = None poi_permissions = None poi_permissions_remove = [] for poi in ewcfg.poi_list: if poi.permissions != None and poi.permissions != poi_permissions: poi_permissions_remove.append(poi.id_poi) poi_roles_remove = [] for poi in ewcfg.poi_list: if poi.major_role != None and poi.major_role != poi_major_role: poi_roles_remove.append(poi.major_role) #if poi.minor_role != None and poi.minor_role != poi_minor_role: poi_roles_remove.append(poi.minor_role) misc_roles_remove = [ewcfg.role_gellphone, ewcfg.role_slimernalia] # Remove user's gellphone role if they don't have a phone role_gellphone = None if user_data.has_gellphone(): role_gellphone = ewcfg.role_gellphone misc_roles_remove.remove(ewcfg.role_gellphone) role_slimernalia = None if user_data.slimernalia_kingpin == True: role_slimernalia = ewcfg.role_slimernalia misc_roles_remove.remove(ewcfg.role_slimernalia) role_ids = [] for role_id in roles_map_user: try: role_data = EwRole(id_server=id_server, id_role=role_id) roleName = role_data.name if roleName != None and roleName not in faction_roles_remove and roleName not in misc_roles_remove and roleName not in poi_roles_remove and role_data.id_role != '': role_ids.append(int(role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find role with id {}'.format(role_id)) try: role_data = EwRole(id_server=id_server, name=faction_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find faction role {}'.format(faction_role)) try: role_data = EwRole(id_server=id_server, name=pvp_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find pvp role {}'.format(pvp_role)) try: role_data = EwRole(id_server=id_server, name=active_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find active role {}'.format(active_role)) try: role_data = EwRole(id_server=id_server, name=tutorial_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find tutorial role {}'.format(tutorial_role)) # poi roles are disabled try: major_role_data = EwRole(id_server=id_server, name=poi_major_role) if not major_role_data.id_role in role_ids and major_role_data.id_role != '': role_ids.append(int(major_role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find major role {}'.format(poi_major_role)) #try: # minor_role_data = EwRole(id_server = id_server, name = poi_minor_role) # if not minor_role_data.id_role in role_ids and minor_role_data.id_role != '': # role_ids.append(int(minor_role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) #except: # ewutils.logMsg('error: couldn\'t find minor role {}'.format(poi_minor_role)) try: role_data = EwRole(id_server=id_server, name=role_gellphone) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find gellphone role {}'.format(role_gellphone)) try: role_data = EwRole(id_server=id_server, name=role_slimernalia) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find slimernalia role {}'.format( role_slimernalia)) # if faction_role not in role_names: # role_names.append(faction_role) # if poi_role != None and poi_role not in role_names: # role_names.append(poi_role) #replacement_roles = [] #for name in role_names: # role = roles_map.get(name) # if role != None: # replacement_roles.append(role) # else: # ewutils.logMsg("error: role missing \"{}\"".format(name)) #ewutils.logMsg('looking for {} roles to replace'.format(len(role_ids))) replacement_roles = [] for role in member.guild.roles: if role.id in role_ids: # ewutils.logMsg('found role {} with id {}'.format(role.name, role.id)) replacement_roles.append(role) #ewutils.logMsg('found {} roles to replace'.format(len(replacement_roles))) try: await member.edit(roles=replacement_roles) except Exception as e: ewutils.logMsg('error: failed to replace roles for {}:{}'.format( member.display_name, str(e))) if refresh_perms: await refresh_user_perms(client=client, id_server=id_server, used_member=member)
async def updateRoles(client=None, member=None, server_default=None, refresh_perms=True, remove_or_apply_flag=None): time_now = int(time.time()) if server_default != None: user_data = EwUser(id_user=member.id, id_server=server_default) else: user_data = EwUser(member=member) id_server = user_data.id_server if member == None: return ewutils.logMsg("error: member was not supplied for updateRoles") #roles_map = ewutils.getRoleMap(member.guild.roles) roles_map_user = ewutils.getRoleIdMap(member.roles) if user_data.life_state != ewcfg.life_state_kingpin and ewcfg.role_kingpin in roles_map_user: # Fix the life_state of kingpins, if somehow it wasn't set. user_data.life_state = ewcfg.life_state_kingpin user_data.persist() elif user_data.life_state != ewcfg.life_state_grandfoe and ewcfg.role_grandfoe in roles_map_user: # Fix the life_state of a grand foe. user_data.life_state = ewcfg.life_state_grandfoe user_data.persist() faction_roles_remove = [ ewcfg.role_juvenile, ewcfg.role_juvenile_active, ewcfg.role_juvenile_pvp, ewcfg.role_rowdyfuckers, ewcfg.role_rowdyfuckers_pvp, ewcfg.role_rowdyfuckers_active, ewcfg.role_copkillers, ewcfg.role_copkillers_pvp, ewcfg.role_copkillers_active, ewcfg.role_corpse, ewcfg.role_corpse_pvp, ewcfg.role_corpse_active, ewcfg.role_kingpin, ewcfg.role_grandfoe, ewcfg.role_slimecorp, ewcfg.role_tutorial, ewcfg.role_shambler, ] # Manage faction roles. faction_role = ewutils.get_faction(user_data=user_data) faction_roles_remove.remove(faction_role) pvp_role = None active_role = None if faction_role in ewcfg.role_to_pvp_role: if user_data.time_expirpvp >= time_now: pvp_role = ewcfg.role_to_pvp_role.get(faction_role) faction_roles_remove.remove(pvp_role) # if ewutils.is_otp(user_data): # active_role = ewcfg.role_to_active_role.get(faction_role) # faction_roles_remove.remove(active_role) tutorial_role = None if user_data.poi in ewcfg.tutorial_pois: tutorial_role = ewcfg.role_tutorial faction_roles_remove.remove(tutorial_role) # Manage location roles. user_poi = ewcfg.id_to_poi.get(user_data.poi) #print(user_poi.id_poi) if user_poi != None: # poi_role = user_poi.role poi_major_role = user_poi.major_role poi_minor_role = user_poi.minor_role poi_permissions = user_poi.permissions else: # poi_role = None poi_major_role = None poi_minor_role = None poi_permissions = None poi_permissions_remove = [] for poi in ewcfg.poi_list: if poi.permissions != None and poi.permissions != poi_permissions: poi_permissions_remove.append(poi.id_poi) poi_roles_remove = [] for poi in ewcfg.poi_list: if poi.major_role != None and poi.major_role != poi_major_role: poi_roles_remove.append(poi.major_role) if poi.minor_role != None and poi.minor_role != poi_minor_role: poi_roles_remove.append(poi.minor_role) misc_roles_remove = [ewcfg.role_gellphone, ewcfg.role_slimernalia] # Remove user's gellphone role if they don't have a phone role_gellphone = None gellphones = ewitem.find_item_all(item_search=ewcfg.item_id_gellphone, id_user=user_data.id_user, id_server=user_data.id_server, item_type_filter=ewcfg.it_item) gellphone_active = False for phone in gellphones: phone_data = ewitem.EwItem(id_item=phone.get('id_item')) if phone_data.item_props.get('active') == 'true': gellphone_active = True break if gellphone_active == True: role_gellphone = ewcfg.role_gellphone misc_roles_remove.remove(ewcfg.role_gellphone) role_slimernalia = None #if user_data.slimernalia_kingpin == True: # role_slimernalia = ewcfg.role_slimernalia # misc_roles_remove.remove(ewcfg.role_slimernalia) role_ids = [] for role_id in roles_map_user: try: role_data = EwRole(id_server=id_server, id_role=role_id) roleName = role_data.name if roleName != None and roleName not in faction_roles_remove and roleName not in misc_roles_remove and roleName not in poi_roles_remove and role_data.id_role != '': role_ids.append(int(role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find role with id {}'.format(role_id)) try: role_data = EwRole(id_server=id_server, name=faction_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find faction role {}'.format(faction_role)) try: role_data = EwRole(id_server=id_server, name=pvp_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find pvp role {}'.format(pvp_role)) try: role_data = EwRole(id_server=id_server, name=active_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find active role {}'.format(active_role)) try: role_data = EwRole(id_server=id_server, name=tutorial_role) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find tutorial role {}'.format(tutorial_role)) try: major_role_data = EwRole(id_server=id_server, name=poi_major_role) if not major_role_data.id_role in role_ids and major_role_data.id_role != '': role_ids.append(int(major_role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find major role {}'.format(poi_major_role)) try: minor_role_data = EwRole(id_server=id_server, name=poi_minor_role) if not minor_role_data.id_role in role_ids and minor_role_data.id_role != '': role_ids.append(int(minor_role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find minor role {}'.format(poi_minor_role)) try: role_data = EwRole(id_server=id_server, name=role_gellphone) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg( 'error: couldn\'t find gellphone role {}'.format(role_gellphone)) try: role_data = EwRole(id_server=id_server, name=role_slimernalia) if not role_data.id_role in role_ids and role_data.id_role != '': role_ids.append(int(role_data.id_role)) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find slimernalia role {}'.format( role_slimernalia)) # if faction_role not in role_names: # role_names.append(faction_role) # if poi_role != None and poi_role not in role_names: # role_names.append(poi_role) #replacement_roles = [] #for name in role_names: # role = roles_map.get(name) # if role != None: # replacement_roles.append(role) # else: # ewutils.logMsg("error: role missing \"{}\"".format(name)) #ewutils.logMsg('looking for {} roles to replace'.format(len(role_ids))) replacement_roles = [] for role in member.guild.roles: if role.id in role_ids: # ewutils.logMsg('found role {} with id {}'.format(role.name, role.id)) replacement_roles.append(role) #ewutils.logMsg('found {} roles to replace'.format(len(replacement_roles))) try: time_now = int(time.time()) was_pvp = user_data.time_expirpvp > time_now user_is_pvp = False role_ids = [] for pvp_role in ewcfg.role_to_pvp_role.values(): role = EwRole(id_server=member.guild.id, name=pvp_role) role_ids.append(role.id_role) for role in member.roles: if role.id in role_ids: user_is_pvp = True break if remove_or_apply_flag != None: if was_pvp: if remove_or_apply_flag == 'apply': if not user_is_pvp: # ewutils.logMsg('applying flag...') await member.edit(roles=replacement_roles) elif not was_pvp: if remove_or_apply_flag == 'remove': # ewutils.logMsg('removing flag...') await member.edit(roles=replacement_roles) else: await member.edit(roles=replacement_roles) except: ewutils.logMsg('error: failed to replace roles for {}'.format( member.display_name)) if refresh_perms: await refresh_user_perms(client=client, id_server=id_server, used_member=member)
async def on_ready(): global init_complete if init_complete: return init_complete = True ewcfg.set_client(client) ewutils.logMsg('Logged in as {} ({}).'.format(client.user.name, client.user.id)) ewutils.logMsg("Loaded NLACakaNM world map. ({}x{})".format(ewmap.map_width, ewmap.map_height)) ewmap.map_draw() # Flatten role names to all lowercase, no spaces. fake_observer = EwUser() fake_observer.life_state = ewcfg.life_state_observer for poi in ewcfg.poi_list: if poi.role != None: poi.role = ewutils.mapRoleName(poi.role) neighbors = [] neighbor_ids = [] if poi.coord != None: neighbors = ewmap.path_to(coord_start = poi.coord, user_data = fake_observer) #elif poi.id_poi == ewcfg.poi_id_thesewers: # neighbors = ewcfg.poi_list if neighbors != None: for neighbor in neighbors: neighbor_ids.append(neighbor.id_poi) ewcfg.poi_neighbors[poi.id_poi] = set(neighbor_ids) ewutils.logMsg("Found neighbors for poi {}: {}".format(poi.id_poi, ewcfg.poi_neighbors[poi.id_poi])) for id_poi in ewcfg.landmark_pois: ewutils.logMsg("beginning landmark precomputation for " + id_poi) poi = ewcfg.id_to_poi.get(id_poi) ewmap.landmarks[id_poi] = ewmap.score_map_from( coord_start = poi.coord, user_data = fake_observer, landmark_mode = True ) ewutils.logMsg("finished landmark precomputation") try: await client.change_presence(game = discord.Game(name = "EW " + ewcfg.version)) except: ewutils.logMsg("Failed to change_presence!") # Look for a Twitch client_id on disk. # FIXME debug - temporarily disable Twitch integration if False: twitch_client_id = ewutils.getTwitchClientId() # If no twitch client ID is available, twitch integration will be disabled. # FIXME debug - temporarily disable Twitch integration. if True: twitch_client_id = None ewutils.logMsg('Twitch integration disabled.') elif twitch_client_id == None or len(twitch_client_id) == 0: ewutils.logMsg('No twitch_client_id file found. Twitch integration disabled.') else: ewutils.logMsg("Enabled Twitch integration.") # Channels in the connected discord servers to announce to. channels_announcement = [] # Channels in the connected discord servers to send stock market updates to. Map of server ID to channel. channels_stockmarket = {} for server in client.servers: # Update server data in the database ewserver.server_update(server = server) # store the list of channels in an ewutils field ewcfg.update_server_list(server = server) # find roles and add them to the database ewrolemgr.setupRoles(client = client, id_server = server.id) # hides the names of poi roles await ewrolemgr.hideRoleNames(client = client, id_server = server.id) # Grep around for channels ewutils.logMsg("connected to server: {}".format(server.name)) for channel in server.channels: if(channel.type == discord.ChannelType.text): if(channel.name == ewcfg.channel_twitch_announcement): channels_announcement.append(channel) ewutils.logMsg("• found channel for announcements: {}".format(channel.name)) elif(channel.name == ewcfg.channel_stockexchange): channels_stockmarket[server.id] = channel ewutils.logMsg("• found channel for stock exchange: {}".format(channel.name)) # create all the districts in the database for poi_object in ewcfg.poi_list: poi = poi_object.id_poi # call the constructor to create an entry if it doesnt exist yet dist = EwDistrict(id_server = server.id, district = poi) # change the ownership to the faction that's already in control to initialize topic names try: # initialize gang bases if poi == ewcfg.poi_id_rowdyroughhouse: dist.controlling_faction = ewcfg.faction_rowdys elif poi == ewcfg.poi_id_copkilltown: dist.controlling_faction = ewcfg.faction_killers resp_cont = dist.change_ownership(new_owner = dist.controlling_faction, actor = "init", client = client) dist.persist() await resp_cont.post() except: ewutils.logMsg('Could not change ownership for {} to "{}".'.format(poi, dist.controlling_faction)) asyncio.ensure_future(ewdistrict.capture_tick_loop(id_server = server.id)) asyncio.ensure_future(ewutils.bleed_tick_loop(id_server = server.id)) asyncio.ensure_future(ewutils.enemy_action_tick_loop(id_server=server.id)) asyncio.ensure_future(ewutils.spawn_enemies_tick_loop(id_server = server.id)) asyncio.ensure_future(ewutils.burn_tick_loop(id_server = server.id)) asyncio.ensure_future(ewutils.remove_status_loop(id_server = server.id)) asyncio.ensure_future(ewworldevent.event_tick_loop(id_server = server.id)) asyncio.ensure_future(ewutils.sap_tick_loop(id_server = server.id)) if not debug: await ewtransport.init_transports(id_server = server.id) asyncio.ensure_future(ewweather.weather_tick_loop(id_server = server.id)) asyncio.ensure_future(ewslimeoid.slimeoid_tick_loop(id_server = server.id)) asyncio.ensure_future(ewfarm.farm_tick_loop(id_server = server.id)) try: ewutils.logMsg('Creating message queue directory.') os.mkdir(ewcfg.dir_msgqueue) except FileExistsError: ewutils.logMsg('Message queue directory already exists.') ewutils.logMsg('Ready.') """ Set up for infinite loop to perform periodic tasks. """ time_now = int(time.time()) time_last_pvp = time_now time_last_twitch = time_now time_twitch_downed = 0 # Every three hours we log a message saying the periodic task hook is still active. On startup, we want this to happen within about 60 seconds, and then on the normal 3 hour interval. time_last_logged = time_now - ewcfg.update_hookstillactive + 60 stream_live = None ewutils.logMsg('Beginning periodic hook loop.') while not ewutils.TERMINATE: time_now = int(time.time()) # Periodic message to log that this stuff is still running. if (time_now - time_last_logged) >= ewcfg.update_hookstillactive: time_last_logged = time_now ewutils.logMsg("Periodic hook still active.") # Check to see if a stream is live via the Twitch API. # FIXME disabled if False: #if twitch_client_id != None and (time_now - time_last_twitch) >= ewcfg.update_twitch: time_last_twitch = time_now try: # Twitch API call to see if there are any active streams. json_string = "" p = subprocess.Popen( "curl -H 'Client-ID: {}' -X GET 'https://api.twitch.tv/helix/streams?user_login = rowdyfrickerscopkillers' 2>/dev/null".format(twitch_client_id), shell = True, stdout = subprocess.PIPE ) for line in p.stdout.readlines(): json_string += line.decode('utf-8') json_parsed = json.loads(json_string) # When a stream is up, data is an array of stream information objects. data = json_parsed.get('data') if data != None: data_count = len(data) stream_was_live = stream_live stream_live = True if data_count > 0 else False if stream_was_live == True and stream_live == False: time_twitch_downed = time_now if stream_was_live == False and stream_live == True and (time_now - time_twitch_downed) > 600: ewutils.logMsg("The stream is now live.") # The stream has transitioned from offline to online. Make an announcement! for channel in channels_announcement: await ewutils.send_message( client, channel, "ATTENTION CITIZENS. THE **ROWDY F****R** AND THE **COP KILLER** ARE **STREAMING**. BEWARE OF INCREASED KILLER AND ROWDY ACTIVITY.\n\n@everyone\n{}".format( "https://www.twitch.tv/rowdyfrickerscopkillers" ) ) except: ewutils.logMsg('Twitch handler hit an exception (continuing): {}'.format(json_string)) traceback.print_exc(file = sys.stdout) # Clear PvP roles from players who are no longer flagged. if (time_now - time_last_pvp) >= ewcfg.update_pvp: time_last_pvp = time_now try: for server in client.servers: role_ids = [] for pvp_role in ewcfg.role_to_pvp_role.values(): role = ewrolemgr.EwRole(id_server = server.id, name = pvp_role) role_ids.append(role.id_role) # Monitor all user roles and update if a user is no longer flagged for PvP. for member in server.members: for role in member.roles: if role.id in role_ids: await ewrolemgr.updateRoles(client = client, member = member) break except: ewutils.logMsg('An error occurred in the scheduled role update task:') traceback.print_exc(file=sys.stdout) # Adjust the exchange rate of slime for the market. try: for server in client.servers: # Load market data from the database. market_data = EwMarket(id_server = server.id) if market_data.time_lasttick + ewcfg.update_market <= time_now: market_response = "" for stock in ewcfg.stocks: s = EwStock(server.id, stock) # we don't update stocks when they were just added if s.timestamp != 0: s.timestamp = time_now market_response = ewmarket.market_tick(s, server.id) await ewutils.send_message(client, channels_stockmarket.get(server.id), market_response) market_data = EwMarket(id_server = server.id) market_data.time_lasttick = time_now # Advance the time and potentially change weather. market_data.clock += 1 if market_data.clock >= 24 or market_data.clock < 0: market_data.clock = 0 market_data.day += 1 if market_data.clock == 6: # Update the list of available bazaar items by clearing the current list and adding the new items market_data.bazaar_wares.clear() bazaar_foods = [] bazaar_cosmetics = [] bazaar_general_items = [] bazaar_furniture = [] for item in ewcfg.vendor_inv.get(ewcfg.vendor_bazaar): if item in ewcfg.item_names: bazaar_general_items.append(item) elif item in ewcfg.food_names: bazaar_foods.append(item) elif item in ewcfg.cosmetic_names: bazaar_cosmetics.append(item) elif item in ewcfg.furniture_names: bazaar_furniture.append(item) market_data.bazaar_wares['slimecorp1'] = ewcfg.weapon_id_umbrella market_data.bazaar_wares['slimecorp2'] = ewcfg.cosmetic_id_raincoat market_data.bazaar_wares['generalitem'] = random.choice(bazaar_general_items) market_data.bazaar_wares['food1'] = random.choice(bazaar_foods) # Don't add repeated foods bw_food2 = None while bw_food2 is None or bw_food2 in market_data.bazaar_wares.values(): bw_food2 = random.choice(bazaar_foods) market_data.bazaar_wares['food2'] = bw_food2 market_data.bazaar_wares['cosmetic1'] = random.choice(bazaar_cosmetics) # Don't add repeated cosmetics bw_cosmetic2 = None while bw_cosmetic2 is None or bw_cosmetic2 in market_data.bazaar_wares.values(): bw_cosmetic2 = random.choice(bazaar_cosmetics) market_data.bazaar_wares['cosmetic2'] = bw_cosmetic2 bw_cosmetic3 = None while bw_cosmetic3 is None or bw_cosmetic3 in market_data.bazaar_wares.values(): bw_cosmetic3 = random.choice(bazaar_cosmetics) market_data.bazaar_wares['cosmetic3'] = bw_cosmetic3 bw_furniture2 = None while bw_furniture2 is None or bw_furniture2 in market_data.bazaar_wares.values(): bw_furniture2 = random.choice(bazaar_furniture) market_data.bazaar_wares['furniture2'] = bw_furniture2 bw_furniture3 = None while bw_furniture3 is None or bw_furniture3 in market_data.bazaar_wares.values(): bw_furniture3 = random.choice(bazaar_furniture) market_data.bazaar_wares['furniture3'] = bw_furniture3 if random.random() == 0.1: market_data.bazaar_wares['minigun'] = ewcfg.weapon_id_minigun market_data.persist() if not ewutils.check_fursuit_active(market_data.id_server): ewcosmeticitem.dedorn_all_costumes() if market_data.clock == 6 and market_data.day % 8 == 0: await ewapt.rent_time(id_server=server.id) market_data = EwMarket(id_server=server.id) market_data.persist() if market_data.clock == 6: response = ' The SlimeCorp Stock Exchange is now open for business.' await ewutils.send_message(client, channels_stockmarket.get(server.id), response) elif market_data.clock == 20: response = ' The SlimeCorp Stock Exchange has closed for the night.' await ewutils.send_message(client, channels_stockmarket.get(server.id), response) market_data = EwMarket(id_server = server.id) if random.randrange(3) == 0: pattern_count = len(ewcfg.weather_list) if pattern_count > 1: weather_old = market_data.weather if random.random() < 0.4: market_data.weather = ewcfg.weather_bicarbonaterain # Randomly select a new weather pattern. Try again if we get the same one we currently have. while market_data.weather == weather_old: pick = random.randrange(len(ewcfg.weather_list)) market_data.weather = ewcfg.weather_list[pick].name # Log message for statistics tracking. ewutils.logMsg("The weather changed. It's now {}.".format(market_data.weather)) # Persist new data. market_data.persist() # Decay slime totals ewutils.decaySlimes(id_server = server.id) # Increase hunger for all players below the max. #ewutils.pushupServerHunger(id_server = server.id) # Decrease inebriation for all players above min (0). ewutils.pushdownServerInebriation(id_server = server.id) # Remove fish offers which have timed out ewfish.kill_dead_offers(id_server = server.id) # kill advertisements that have timed out ewads.delete_expired_ads(id_server = server.id) await ewdistrict.give_kingpins_slime_and_decay_capture_points(id_server = server.id) await ewmap.kick(server.id) # Post leaderboards at 6am NLACakaNM time. if market_data.clock == 6: await ewleaderboard.post_leaderboards(client = client, server = server) except: ewutils.logMsg('An error occurred in the scheduled slime market update task:') traceback.print_exc(file = sys.stdout) # Parse files dumped into the msgqueue directory and send messages as needed. try: for msg_file in os.listdir(ewcfg.dir_msgqueue): fname = "{}/{}".format(ewcfg.dir_msgqueue, msg_file) msg = ewutils.readMessage(fname) os.remove(fname) msg_channel_names = [] msg_channel_names_reverb = [] if msg.channel != None: msg_channel_names.append(msg.channel) if msg.poi != None: poi = ewcfg.id_to_poi.get(msg.poi) if poi != None: if poi.channel != None and len(poi.channel) > 0: msg_channel_names.append(poi.channel) if msg.reverb == True: pois_adjacent = ewmap.path_to(poi_start = msg.poi) for poi_adjacent in pois_adjacent: if poi_adjacent.channel != None and len(poi_adjacent.channel) > 0: msg_channel_names_reverb.append(poi_adjacent.channel) if len(msg_channel_names) == 0: ewutils.logMsg('in file {} message for channel {} (reverb {})\n{}'.format(msg_file, msg.channel, msg.reverb, msg.message)) else: # Send messages to every connected server. for server in client.servers: for channel in server.channels: if channel.name in msg_channel_names: await ewutils.send_message(client, channel, "**{}**".format(msg.message)) elif channel.name in msg_channel_names_reverb: await ewutils.send_message(client, channel, "**Something is happening nearby...\n\n{}**".format(msg.message)) except: ewutils.logMsg('An error occurred while trying to process the message queue:') traceback.print_exc(file = sys.stdout) # Wait a while before running periodic tasks. await asyncio.sleep(15)
async def on_message(message): time_now = int(time.time()) ewcfg.set_client(client) """ do not interact with our own messages """ if message.author.id == client.user.id or message.author.bot == True: return if message.server != None: # Note that the user posted a message. active_map = active_users_map.get(message.server.id) if active_map == None: active_map = {} active_users_map[message.server.id] = active_map active_map[message.author.id] = True # Update player information. ewplayer.player_update( member = message.author, server = message.server ) content_tolower = message.content.lower() re_awoo = re.compile('.*![a]+[w]+o[o]+.*') # update the player's time_last_action which is used for kicking AFK players out of subzones if message.server != None: try: ewutils.execute_sql_query("UPDATE users SET {time_last_action} = %s WHERE id_user = %s AND id_server = %s".format( time_last_action = ewcfg.col_time_last_action ), ( int(time.time()), message.author.id, message.server.id )) except: ewutils.logMsg('server {}: failed to update time_last_action for {}'.format(message.server.id, message.author.id)) user_data = EwUser(member = message.author) statuses = user_data.getStatusEffects() if ewcfg.status_strangled_id in statuses: strangle_effect = EwStatusEffect(id_status=ewcfg.status_strangled_id, user_data=user_data) source = EwPlayer(id_user=strangle_effect.source, id_server=message.server.id) response = "You manage to break {}'s garrote wire!".format(source.display_name) user_data.clear_status(ewcfg.status_strangled_id) return await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) if message.content.startswith(ewcfg.cmd_prefix) or message.server == None or len(message.author.roles) < 2: """ Wake up if we need to respond to messages. Could be: message starts with ! direct message (server == None) user is new/has no roles (len(roles) < 2) """ #Ignore users with weird characters in their name try: message.author.display_name[:3].encode('utf-8').decode('ascii') except UnicodeError: return await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, "We don't take kindly to moon runes around here.")) # tokenize the message. the command should be the first word. try: tokens = shlex.split(message.content) # it's split with shlex now because shlex regards text within quotes as a single token except: tokens = message.content.split(' ') # if splitting via shlex doesnt work (odd number of quotes), use the old splitting method so it doesnt give an exception tokens_count = len(tokens) cmd = tokens[0].lower() if tokens_count >= 1 else "" # remove mentions to us mentions = list(filter(lambda user : user.id != client.user.id, message.mentions)) mentions_count = len(mentions) # Create command object cmd_obj = ewcmd.EwCmd( tokens = tokens, message = message, client = client, mentions = mentions ) """ Handle direct messages. """ if message.server == None: playermodel = ewplayer.EwPlayer(id_user = message.author.id) usermodel = EwUser(id_user=message.author.id, id_server= playermodel.id_server) poi = ewcfg.id_to_poi.get(usermodel.poi) # Direct message the player their inventory. if ewitem.cmd_is_inventory(cmd): return await ewitem.inventory_print(cmd_obj) elif cmd == ewcfg.cmd_inspect: return await ewitem.item_look(cmd_obj) elif poi.is_apartment: return await ewapt.aptCommands(cmd=cmd_obj) else: time_last = last_helped_times.get(message.author.id, 0) # Only send the help doc once every thirty seconds. There's no need to spam it. if (time_now - time_last) > 30: last_helped_times[message.author.id] = time_now await ewutils.send_message(client, message.channel, ewcfg.generic_help_response) # Nothing else to do in a DM. return # assign the appropriate roles to a user with less than @everyone, faction, location if len(message.author.roles) < 3: await ewrolemgr.updateRoles(client = client, member = message.author) user_data = EwUser(member = message.author) if user_data.arrested: return mutations = user_data.get_mutations() # Scold/ignore offline players. if message.author.status == discord.Status.offline: if ewcfg.mutation_id_chameleonskin not in mutations or cmd not in ewcfg.offline_cmds: response = "You cannot participate in the ENDLESS WAR while offline." return await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) if user_data.time_lastoffline > time_now - ewcfg.time_offline: if ewcfg.mutation_id_chameleonskin not in mutations or cmd not in ewcfg.offline_cmds: response = "You are too paralyzed by ENDLESS WAR's judgemental stare to act." return await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) # Ignore stunned players if ewcfg.status_stunned_id in statuses: return # Check the main command map for the requested command. global cmd_map cmd_fn = cmd_map.get(cmd) if user_data.poi in ewcfg.tutorial_pois: return await ewdungeons.tutorial_cmd(cmd_obj) elif cmd_fn != None: # Execute found command return await cmd_fn(cmd_obj) # FIXME debug # Test item creation elif debug == True and cmd == (ewcfg.cmd_prefix + 'createtestitem'): item_id = ewitem.item_create( item_type = 'medal', id_user = message.author.id, id_server = message.server.id, item_props = { 'medal_name': 'Test Award', 'medal_desc': '**{medal_name}**: *Awarded to Krak by Krak for testing shit.*' } ) ewutils.logMsg('Created item: {}'.format(item_id)) item = EwItem(id_item = item_id) item.item_props['test'] = 'meow' item.persist() item = EwItem(id_item = item_id) await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, ewitem.item_look(item))) # Creates a poudrin elif debug == True and cmd == (ewcfg.cmd_prefix + 'createpoudrin'): for item in ewcfg.item_list: if item.context == "poudrin": ewitem.item_create( item_type = ewcfg.it_item, id_user = message.author.id, id_server = message.server.id, item_props = { 'id_item': item.id_item, 'context': item.context, 'item_name': item.str_name, 'item_desc': item.str_desc, } ), ewutils.logMsg('Created item: {}'.format(item.id_item)) item = EwItem(id_item = item.id_item) item.persist() else: pass await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, "Poudrin created.")) # Gives the user some slime elif debug == True and cmd == (ewcfg.cmd_prefix + 'getslime'): user_data = EwUser(member = message.author) user_initial_level = user_data.slimelevel response = "You get 100,000 slime!" levelup_response = user_data.change_slimes(n = 100000) was_levelup = True if user_initial_level < user_data.slimelevel else False if was_levelup: response += " {}".format(levelup_response) user_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'getcoin'): user_data = EwUser(member=message.author) user_data.change_slimecoin(n=1000000000, coinsource=ewcfg.coinsource_spending) response = "You get 1,000,000,000 slimecoin!" user_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) # Deletes all items in your inventory. elif debug == True and cmd == (ewcfg.cmd_prefix + 'clearinv'): user_data = EwUser(member = message.author) ewitem.item_destroyall(id_server = message.server.id, id_user = message.author.id) response = "You destroy every single item in your inventory." user_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'createapple'): item_id = ewitem.item_create( id_user = message.author.id, id_server = message.server.id, item_type = ewcfg.it_food, item_props = { 'id_food': "direapples", 'food_name': "Dire Apples", 'food_desc': "This sure is a illegal Dire Apple!", 'recover_hunger': 500, 'str_eat': "You chomp into this illegal Dire Apple.", 'time_expir': int(time.time() + ewcfg.farm_food_expir) } ) ewutils.logMsg('Created item: {}'.format(item_id)) item = EwItem(id_item = item_id) item.item_props['test'] = 'meow' item.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, "Apple created.")) elif debug == True and cmd == (ewcfg.cmd_prefix + 'createhat'): patrician_rarity = 20 patrician_smelted = random.randint(1, patrician_rarity) patrician = False if patrician_smelted == 1: patrician = True items = [] for cosmetic in ewcfg.cosmetic_items_list: if patrician and cosmetic.rarity == ewcfg.rarity_patrician: items.append(cosmetic) elif not patrician and cosmetic.rarity == ewcfg.rarity_plebeian: items.append(cosmetic) item = items[random.randint(0, len(items) - 1)] item_id = ewitem.item_create( item_type = ewcfg.it_cosmetic, id_user = message.author.id, id_server = message.server.id, item_props = { 'id_cosmetic': item.id_cosmetic, 'cosmetic_name': item.str_name, 'cosmetic_desc': item.str_desc, 'rarity': item.rarity, 'adorned': 'false' } ) ewutils.logMsg('Created item: {}'.format(item_id)) item = EwItem(id_item = item_id) item.item_props['test'] = 'meow' item.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, "Hat created.")) elif debug == True and cmd == (ewcfg.cmd_prefix + 'createfood'): item = ewcfg.food_list[random.randint(0, len(ewcfg.food_list) - 1)] item_id = ewitem.item_create( item_type = ewcfg.it_food, id_user = message.author.id, id_server = message.server.id, item_props = { 'id_food': item.id_food, 'food_name': item.str_name, 'food_desc': item.str_desc, 'recover_hunger': item.recover_hunger, 'str_eat': item.str_eat, 'time_expir': item.time_expir } ) ewutils.logMsg('Created item: {}'.format(item_id)) item = EwItem(id_item = item_id) item.item_props['test'] = 'meow' item.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, "Food created.")) # FIXME debug # Test item deletion elif debug == True and cmd == (ewcfg.cmd_prefix + 'delete'): items = ewitem.inventory( id_user = message.author.id, id_server = message.server.id ) for item in items: ewitem.item_delete( id_item = item.get('id_item') ) await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, 'ok')) # AWOOOOO elif re_awoo.match(cmd): return await ewcmd.cmd_howl(cmd_obj) # Debug command to override the role of a user elif debug == True and cmd == (ewcfg.cmd_prefix + 'setrole'): response = "" if mentions_count == 0: response = 'Set who\'s role?' else: roles_map = ewutils.getRoleMap(message.server.roles) role_target = tokens[1] role = roles_map.get(role_target) if role != None: for user in mentions: try: await client.replace_roles(user, role) except: ewutils.logMsg('Failed to replace_roles for user {} with {}.'.format(user.display_name, role.name)) response = 'Done.' else: response = 'Unrecognized role.' await ewutils.send_message(client, cmd.message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'getrowdy'): response = "You get rowdy. F**k. YES!" user_data = EwUser(member=message.author) user_data.life_state = ewcfg.life_state_enlisted user_data.faction = ewcfg.faction_rowdys user_data.time_lastenlist = time_now + ewcfg.cd_enlist user_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'getkiller'): response = "You uh... 'get' killer. Sure." user_data = EwUser(member=message.author) user_data.life_state = ewcfg.life_state_enlisted user_data.faction = ewcfg.faction_killers user_data.time_lastenlist = time_now + ewcfg.cd_enlist user_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) # Toggles rain on and off elif debug == True and cmd == (ewcfg.cmd_prefix + 'toggledownfall'): market_data = EwMarket(id_server=message.server.id) if market_data.weather == ewcfg.weather_bicarbonaterain: newweather = ewcfg.weather_sunny market_data.weather = newweather response = "Bicarbonate rain turned OFF. Weather was set to {}.".format(newweather) else: market_data.weather = ewcfg.weather_bicarbonaterain response = "Bicarbonate rain turned ON." market_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'dayforward'): market_data = EwMarket(id_server=message.server.id) market_data.day += 1 market_data.persist() response = "Time has progressed 1 day forward manually." if ewutils.check_fursuit_active(market_data.id_server): response += "\nIt's a full moon!" await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) elif debug == True and cmd == (ewcfg.cmd_prefix + 'hourforward'): market_data = EwMarket(id_server=message.server.id) market_data.clock += 1 response = "Time has progressed 1 hour forward manually." if market_data.clock >= 24 or market_data.clock < 0: market_data.clock = 0 market_data.day += 1 response += "\nMidnight has come. 1 day progressed forward." if ewutils.check_fursuit_active(market_data.id_server): response += "\nIt's a full moon!" market_data.persist() await ewutils.send_message(client, message.channel, ewutils.formatMessage(message.author, response)) # didn't match any of the command words. else: """ couldn't process the command. bail out!! """ """ bot rule 0: be cute """ randint = random.randint(1,3) msg_mistake = "ENDLESS WAR is growing frustrated." if randint == 2: msg_mistake = "ENDLESS WAR denies you his favor." elif randint == 3: msg_mistake = "ENDLESS WAR pays you no mind." msg = await ewutils.send_message(client, cmd_obj.message.channel, msg_mistake) await asyncio.sleep(2) try: await client.delete_message(msg) except: pass elif content_tolower.find(ewcfg.cmd_howl) >= 0 or content_tolower.find(ewcfg.cmd_howl_alt1) >= 0 or re_awoo.match(content_tolower): """ Howl if !howl is in the message at all. """ return await ewcmd.cmd_howl(ewcmd.EwCmd( message = message, client = client ))
async def tutorial_cmd(cmd): user_data = EwUser(member=cmd.message.author) client = cmd.client if user_data.poi not in ewcfg.tutorial_pois: return if user_data.id_user not in user_to_tutorial_state: return await begin_tutorial(cmd.message.author) tutorial_state = user_to_tutorial_state.get(user_data.id_user) tutorial_scene = ewcfg.dungeon_tutorial[tutorial_state] cmd_content = cmd.message.content[1:].lower() if cmd_content in tutorial_scene.options: new_state = tutorial_scene.options.get(cmd_content) user_to_tutorial_state[user_data.id_user] = new_state scene = ewcfg.dungeon_tutorial[new_state] if scene.poi != None: user_data.poi = scene.poi if scene.life_state != None: user_data.life_state = scene.life_state user_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) response = format_tutorial_response(scene) poi_def = ewcfg.id_to_poi.get(user_data.poi) channels = [poi_def.channel] return await ewutils.post_in_channels( cmd.message.server.id, ewutils.formatMessage(cmd.message.author, response), channels) else: """ couldn't process the command. bail out!! """ """ bot rule 0: be cute """ randint = random.randint(1, 3) msg_mistake = "ENDLESS WAR is growing frustrated." if randint == 2: msg_mistake = "ENDLESS WAR denies you his favor." elif randint == 3: msg_mistake = "ENDLESS WAR pays you no mind." msg = await ewutils.send_message(client, cmd.message.channel, msg_mistake) await asyncio.sleep(2) try: await client.delete_message(msg) except: pass response = format_tutorial_response(tutorial_scene) return await ewutils.send_message( client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def updateRoles(client=None, member=None, server_default=None): time_now = int(time.time()) if server_default != None: user_data = EwUser(id_user=member.id, id_server=server_default) else: user_data = EwUser(member=member) id_server = user_data.id_server if member == None: return ewutils.logMsg("error: member was not supplied for updateRoles") #roles_map = ewutils.getRoleMap(member.server.roles) roles_map_user = ewutils.getRoleIdMap(member.roles) if user_data.life_state != ewcfg.life_state_kingpin and ewcfg.role_kingpin in roles_map_user: # Fix the life_state of kingpins, if somehow it wasn't set. user_data.life_state = ewcfg.life_state_kingpin user_data.persist() elif user_data.life_state != ewcfg.life_state_grandfoe and ewcfg.role_grandfoe in roles_map_user: # Fix the life_state of a grand foe. user_data.life_state = ewcfg.life_state_grandfoe user_data.persist() faction_roles_remove = [ ewcfg.role_juvenile, ewcfg.role_juvenile_active, ewcfg.role_juvenile_pvp, ewcfg.role_rowdyfuckers, ewcfg.role_rowdyfuckers_pvp, ewcfg.role_rowdyfuckers_active, ewcfg.role_copkillers, ewcfg.role_copkillers_pvp, ewcfg.role_copkillers_active, ewcfg.role_corpse, ewcfg.role_corpse_pvp, ewcfg.role_corpse_active, ewcfg.role_kingpin, ewcfg.role_grandfoe, ewcfg.role_slimecorp, ] # Manage faction roles. faction_role = ewutils.get_faction(user_data=user_data) faction_roles_remove.remove(faction_role) pvp_role = None active_role = None if faction_role in ewcfg.role_to_pvp_role: if user_data.time_expirpvp >= time_now: pvp_role = ewcfg.role_to_pvp_role.get(faction_role) faction_roles_remove.remove(pvp_role) if ewutils.is_otp(user_data): active_role = ewcfg.role_to_active_role.get(faction_role) faction_roles_remove.remove(active_role) # Manage location roles. poi = ewcfg.id_to_poi.get(user_data.poi) if poi != None: poi_role = poi.role else: poi_role = None poi_roles_remove = [] for poi in ewcfg.poi_list: if poi.role != None and poi.role != poi_role: poi_roles_remove.append(poi.role) role_ids = [] for role_id in roles_map_user: try: role_data = EwRole(id_server=id_server, id_role=role_id) roleName = role_data.name if roleName != None and roleName not in faction_roles_remove and roleName not in poi_roles_remove: role_ids.append(role_data.id_role) except: ewutils.logMsg( 'error: couldn\'t find role with id {}'.format(role_id)) try: role_data = EwRole(id_server=id_server, name=faction_role) if not role_data.id_role in role_ids: role_ids.append(role_data.id_role) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find role {}'.format(faction_role)) try: role_data = EwRole(id_server=id_server, name=pvp_role) if not role_data.id_role in role_ids: role_ids.append(role_data.id_role) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find role {}'.format(pvp_role)) try: role_data = EwRole(id_server=id_server, name=active_role) if not role_data.id_role in role_ids: role_ids.append(role_data.id_role) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find role {}'.format(active_role)) try: role_data = EwRole(id_server=id_server, name=poi_role) if not role_data.id_role in role_ids: role_ids.append(role_data.id_role) #ewutils.logMsg('found role {} with id {}'.format(role_data.name, role_data.id_role)) except: ewutils.logMsg('error: couldn\'t find role {}'.format(poi_role)) #if faction_role not in role_names: # role_names.append(faction_role) #if poi_role != None and poi_role not in role_names: # role_names.append(poi_role) #replacement_roles = [] #for name in role_names: # role = roles_map.get(name) # if role != None: # replacement_roles.append(role) # else: # ewutils.logMsg("error: role missing \"{}\"".format(name)) #ewutils.logMsg('looking for {} roles to replace'.format(len(role_ids))) replacement_roles = [] for role in member.server.roles: if role.id in role_ids: #ewutils.logMsg('found role {} with id {}'.format(role.name, role.id)) replacement_roles.append(role) #ewutils.logMsg('found {} roles to replace'.format(len(replacement_roles))) try: await client.replace_roles(member, *replacement_roles) except: ewutils.logMsg('error: failed to replace roles for {}'.format( member.display_name))