Пример #1
0
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)
Пример #2
0
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))
Пример #3
0
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
Пример #4
0
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))
Пример #5
0
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))
Пример #6
0
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))
Пример #7
0
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
Пример #8
0
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))
Пример #9
0
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)
Пример #10
0
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))
Пример #11
0
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)
Пример #12
0
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))
Пример #13
0
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))
Пример #14
0
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))
Пример #15
0
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))
Пример #16
0
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))
Пример #17
0
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)
Пример #18
0
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)
Пример #19
0
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)
Пример #20
0
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
		))
Пример #21
0
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))
Пример #22
0
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))