async def complete_trade(cmd): user_data = EwUser(member=cmd.message.author) if user_data.life_state == ewcfg.life_state_shambler: response = "You lack the higher brain functions required to {}.".format(cmd.tokens[0]) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) user_trade = ewutils.active_trades.get(user_data.id_user) if user_trade != None and len(user_trade) > 0 and user_trade.get("state") > ewcfg.trade_state_proposed: user_trade["state"] = ewcfg.trade_state_complete trader_id = user_trade.get("trader") if ewutils.active_trades.get(trader_id).get("state") != ewcfg.trade_state_complete: partner_player = EwPlayer(id_user=trader_id, id_server=user_data.id_server) response = "You tell {} that you're ready to finish the trade.".format(partner_player.display_name) else: trade_partner = EwUser(id_user=trader_id, id_server=user_data.id_server) # items this player is offering items_offered = {} # items the other player is offering trader_items_offered = {} for item in ewutils.trading_offers.get(user_data.id_user): if items_offered.get(item.get("item_type")) != None: items_offered[item.get("item_type")] += 1 else: items_offered[item.get("item_type")] = 1 for item in ewutils.trading_offers.get(trade_partner.id_user): if trader_items_offered.get(item.get("item_type")) != None: trader_items_offered[item.get("item_type")] += 1 else: trader_items_offered[item.get("item_type")] = 1 # check items currently held + items being given to the player - items the player is giving # check other user's inventory capacity for item_type in items_offered: it_held = bknd_item.inventory( id_user=trade_partner.id_user, id_server=trade_partner.id_server, item_type_filter=item_type ) if item_type == ewcfg.it_food: if (len(it_held) + items_offered[ewcfg.it_food] - trader_items_offered.get(ewcfg.it_food, 0)) > trade_partner.get_food_capacity(): response = "They can't carry any more food items." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif item_type == ewcfg.it_weapon: if (len(it_held) + items_offered[ewcfg.it_weapon] - trader_items_offered.get(ewcfg.it_weapon, 0)) > trade_partner.get_weapon_capacity(): response = "They can't carry any more weapon items." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: if (len(it_held) + items_offered[item_type] - trader_items_offered.get(item_type, 0)) > ewcfg.generic_inv_limit: response = "They can't carry any more {}s.".format(item_type) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) # check own user's inventory capacity for item_type in trader_items_offered: it_held = bknd_item.inventory( id_user=user_data.id_user, id_server=user_data.id_server, item_type_filter=item_type ) if item_type == ewcfg.it_food: if (len(it_held) + trader_items_offered[ewcfg.it_food] - items_offered.get(ewcfg.it_food, 0)) > user_data.get_food_capacity(): response = "You can't carry any more food items." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif item_type == ewcfg.it_weapon: if (len(it_held) + trader_items_offered[ewcfg.it_weapon] - items_offered.get(ewcfg.it_weapon, 0)) > user_data.get_weapon_capacity(): response = "You can't carry any more weapon items." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: if (len(it_held) + trader_items_offered.get(item_type) - items_offered.get(item_type, 0)) > ewcfg.generic_inv_limit: response = "You can't carry any more {}s.".format(item_type) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) for item in list(ewutils.trading_offers.get(user_data.id_user)): if item.get("id_item") == user_data.weapon: user_data.weapon = -1 user_data.persist() elif item.get("id_item") == user_data.sidearm: user_data.sidearm = -1 user_data.persist() elif item.get("item_type") == ewcfg.it_cosmetic: cosmetic = EwItem(id_item=item.get("id_item")) cosmetic.item_props["adorned"] = 'false' cosmetic.item_props["slimeoid"] = 'false' cosmetic.persist() bknd_item.give_item(id_item=item.get("id_item"), id_user=trade_partner.id_user, id_server=trade_partner.id_server) for item in list(ewutils.trading_offers.get(trade_partner.id_user)): if item.get("id_item") == trade_partner.weapon: trade_partner.weapon = -1 trade_partner.persist() elif item.get("id_item") == trade_partner.sidearm: trade_partner.sidearm = -1 user_data.persist() elif item.get("item_type") == ewcfg.it_cosmetic: cosmetic = EwItem(id_item=item.get("id_item")) cosmetic.item_props["adorned"] = 'false' cosmetic.item_props["slimeoid"] = 'false' cosmetic.persist() bknd_item.give_item(id_item=item.get("id_item"), id_user=user_data.id_user, id_server=user_data.id_server) ewutils.active_trades[user_data.id_user] = {} ewutils.active_trades[trade_partner.id_user] = {} ewutils.trading_offers[user_data.id_user] = [] ewutils.trading_offers[trade_partner.id_user] = [] response = "You shake hands to commemorate another successful deal. That is their hand, right?" else: response = "You're not trading with anyone right now." await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def take(cmd): user_data = EwUser(member=cmd.message.author) response = "" admin = 0 if cmd.message.author.guild_permissions.administrator: admin = 1 poi = poi_static.id_to_poi.get(user_data.poi) if poi.community_chest == None: response = "There is no community chest here." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: if len(poi.factions) > 0 and user_data.faction not in poi.factions: response = "Get real, asshole. You haven't even enlisted into this gang yet, so it's not like they'd trust you with a key to their valubles." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) item_search = ewutils.flattenTokenListToString(cmd.tokens[1:]) item_sought = bknd_item.find_item( item_search=item_search, id_user=poi.community_chest, id_server=cmd.guild.id if cmd.guild is not None else None, admin=admin) if item_sought: if item_sought.get('item_type') == ewcfg.it_food: food_items = bknd_item.inventory(id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=ewcfg.it_food) if len(food_items) >= user_data.get_food_capacity(): del food_items response = "You can't carry any more food items." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif item_sought.get('item_type') == ewcfg.it_weapon: weapons_held = bknd_item.inventory( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=ewcfg.it_weapon) if user_data.life_state == ewcfg.life_state_corpse: del weapons_held response = "Ghosts can't hold weapons." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif len(weapons_held) >= user_data.get_weapon_capacity(): del weapons_held response = "You can't carry any more weapons." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: other_items = bknd_item.inventory( id_user=cmd.message.author.id, id_server=user_data.id_server, item_type_filter=item_sought.get('item_type')) if len(other_items) >= ewcfg.generic_inv_limit: del other_items response = ewcfg.str_generic_inv_limit.format( item_sought.get('item_type')) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) bknd_item.give_item(id_item=item_sought.get('id_item'), id_server=user_data.id_server, id_user=user_data.id_user) response = "You retrieve a {} from the community chest.".format( item_sought.get("name")) del item_sought else: if item_search: response = "There isn't one here." else: response = "{} which item? (check **{}**)".format( cmd.tokens[0], ewcfg.cmd_communitychest) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def take(cmd): user_data = EwUser(member=cmd.message.author) response = "" admin = 0 if cmd.message.author.guild_permissions.administrator: admin = 1 poi = poi_static.id_to_poi.get(user_data.poi) if poi.community_chest == None: response = "There is no community chest here." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: if len(poi.factions) > 0 and user_data.faction not in poi.factions: response = "Get real, asshole. You haven't even enlisted into this gang yet, so it's not like they'd trust you with a key to their valubles." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) multisnag = 1 startparse = 1 if cmd.tokens[1] == 'all': cmd.tokens[1] = '100' if cmd.tokens[1].isnumeric() and cmd.tokens_count > 2: startparse = 2 multisnag = int(cmd.tokens[1]) if multisnag > 100: multisnag = 100 item_search = ewutils.flattenTokenListToString(cmd.tokens[startparse:]) item_sought = bknd_item.find_item( item_search=item_search, id_user=poi.community_chest, id_server=cmd.guild.id if cmd.guild is not None else None, admin=admin) items_snagged = 0 item_list = [] item_cache = bknd_core.get_cache(obj_type="EwItem") if item_sought: item_search = ewutils.flattenTokenListToString(item_sought.get('name')) loop_sought = item_sought.copy() while multisnag > 0 and loop_sought is not None: if items_snagged == 0: inv_response = bknd_item.check_inv_capacity( user_data=user_data, item_type=loop_sought.get('item_type'), return_strings=True, pronoun="You") if inv_response != "": return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, inv_response)) list_items = bknd_item.inventory( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=loop_sought.get('item_type')) if loop_sought.get('item_type') == ewcfg.it_food: food_items = bknd_item.inventory( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=ewcfg.it_food) if user_data.get_food_capacity() - len( food_items) < multisnag: multisnag = user_data.get_food_capacity() - len( food_items) del food_items elif loop_sought.get('item_type') == ewcfg.it_weapon: weapons_held = bknd_item.inventory( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=ewcfg.it_weapon) if user_data.life_state == ewcfg.life_state_corpse: del weapons_held response = "Ghosts can't hold weapons." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif user_data.get_weapon_capacity() - len( weapons_held) < multisnag: multisnag = user_data.get_weapon_capacity() - len( weapons_held) del weapons_held else: other_items = bknd_item.inventory( id_user=cmd.message.author.id, id_server=user_data.id_server, item_type_filter=loop_sought.get('item_type')) if ewcfg.generic_inv_limit - len(other_items) < multisnag: multisnag = ewcfg.generic_inv_limit - len(other_items) del other_items items_snagged += 1 multisnag -= 1 bknd_item.give_item(id_item=loop_sought.get('id_item'), id_server=user_data.id_server, id_user=user_data.id_user) item_list.append(loop_sought.get('id_item')) cache_item = item_cache.get_entry( unique_vals={"id_item": loop_sought.get('id_item')}) cache_item.update({'id_owner': cmd.message.author.id}) item_cache.set_entry(data=cache_item) #loop_sought = bknd_item.find_item(item_search=item_search, id_user=poi.community_chest, id_server=cmd.guild.id if cmd.guild is not None else None, admin=admin) func = partial( bknd_item.find_item, item_search=item_search, id_user=poi.community_chest, id_server=cmd.guild.id if cmd.guild is not None else None, admin=admin) event_loop = asyncio.get_event_loop() loop_sought = await event_loop.run_in_executor(None, func) if items_snagged > 1: name_string = "{}(x{})".format(item_sought.get("name"), items_snagged) else: name_string = item_sought.get('name') response = "You retrieve a {} from the community chest.".format( name_string) del item_sought else: if item_search: response = "There isn't one here." else: response = "{} which item? (check **{}**)".format( cmd.tokens[0], ewcfg.cmd_communitychest) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def order(cmd): user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() if user_data.life_state == ewcfg.life_state_shambler and user_data.poi != ewcfg.poi_id_nuclear_beach_edge: response = "You lack the higher brain functions required to {}.".format(cmd.tokens[0]) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) market_data = EwMarket(id_server=cmd.guild.id) currency_used = 'slime' current_currency_amount = user_data.slimes # poi = ewmap.fetch_poi_if_coordless(cmd.message.channel.name) poi = poi_static.id_to_poi.get(user_data.poi) if poi is None or len(poi.vendors) == 0 or ewutils.channel_name_is_poi(cmd.message.channel.name) == False: # Only allowed in the food court. response = "There’s nothing to buy here. If you want to purchase some items, go to a sub-zone with a vendor in it, like the food court, the speakeasy, or the bazaar." else: poi = poi_static.id_to_poi.get(user_data.poi) district_data = EwDistrict(district=poi.id_poi, id_server=user_data.id_server) shambler_multiplier = 1 # for speakeasy during shambler times if district_data.is_degraded(): if poi.id_poi == ewcfg.poi_id_speakeasy: shambler_multiplier = 4 else: response = "{} has been degraded by shamblers. You can't {} here anymore.".format(poi.str_name, cmd.tokens[0]) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) # value = ewutils.flattenTokenListToString(cmd.tokens[1:2]) # if cmd.tokens_count > 1: # value = cmd.tokens[1] # value = value.lower() value = None togo = False if cmd.tokens_count > 1: for token in cmd.tokens[1:]: if token.startswith('<@') == False and token.lower() not in "togo": # togo can be spelled together or separate value = token break for token in cmd.tokens[1:]: if token.lower() in "togo": # lets people get away with just typing only to or only go (or only t etc.) but whatever togo = True break # Finds the item if it's an EwGeneralItem. if value == "mylittleponyfigurine": value = random.choice(static_items.furniture_pony) item = static_items.item_map.get(value) item_type = ewcfg.it_item if item != None: item_id = item.id_item name = item.str_name # Finds the item if it's an EwFood item. if item == None: item = static_food.food_map.get(value) item_type = ewcfg.it_food if item != None: item_id = item.id_food name = item.str_name # Finds the item if it's an EwCosmeticItem. if item == None: item = static_cosmetics.cosmetic_map.get(value) item_type = ewcfg.it_cosmetic if item != None: item_id = item.id_cosmetic name = item.str_name if item == None: item = static_items.furniture_map.get(value) item_type = ewcfg.it_furniture if item != None: item_id = item.id_furniture name = item.str_name if item_id in static_items.furniture_pony: item.vendors = [ewcfg.vendor_bazaar] if item == None: item = static_weapons.weapon_map.get(value) item_type = ewcfg.it_weapon if item != None: item_id = item.id_weapon name = item.str_weapon if item != None: item_type = item.item_type # Gets a vendor that the item is available and the player currently located in try: current_vendor = (set(item.vendors).intersection(set(poi.vendors))).pop() except: current_vendor = None # Check if the item is available in the current bazaar item rotation if current_vendor == ewcfg.vendor_bazaar: if item_id not in market_data.bazaar_wares.values(): if item_id in static_items.furniture_pony and "mylittleponyfigurine" in market_data.bazaar_wares.values(): pass else: current_vendor = None if current_vendor == ewcfg.vendor_downpourlaboratory: currency_used = 'brainz' current_currency_amount = user_data.gvs_currency if current_vendor is None or len(current_vendor) < 1: response = "Check the {} for a list of items you can {}.".format(ewcfg.cmd_menu, ewcfg.cmd_order) else: response = "" value = item.price premium_purchase = True if item_id in ewcfg.premium_items else False if premium_purchase: togo = True # Just in case they order a premium food item, don't make them eat it right then and there. if ewcfg.cd_premium_purchase > (int(time.time()) - user_data.time_lastpremiumpurchase): response = "That item is in very limited stock! The vendor asks that you refrain from purchasing it for a day or two." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif ewcfg.cd_new_player > (int(time.time()) - user_data.time_joined): response = "You've only been in the city for a few days. The vendor doesn't trust you with that item very much..." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) stock_data = None company_data = None # factor in the current stocks for vendor in item.vendors: if vendor in ewcfg.vendor_stock_map: stock = ewcfg.vendor_stock_map.get(vendor) company_data = EwCompany(id_server=user_data.id_server, stock=stock) stock_data = EwStock(id_server=user_data.id_server, stock=stock) if stock_data is not None: value *= (stock_data.exchange_rate / ewcfg.default_stock_exchange_rate) ** 0.2 controlling_faction = poi_utils.get_subzone_controlling_faction(user_data.poi, user_data.id_server) if controlling_faction != "": # prices are halved for the controlling gang if controlling_faction == user_data.faction: value /= 2 # and 4 times as much for enemy gangsters elif user_data.faction != "": value *= 4 # raise shambled speakeasy price 4 times value *= shambler_multiplier # Raise the price for togo ordering. This gets lowered back down later if someone does togo ordering on a non-food item by mistake. if togo: value *= 1.5 if current_vendor == ewcfg.vendor_breakroom and user_data.faction == ewcfg.faction_slimecorp: value = 0 value = int(value) food_ordered = False target_data = None # Kingpins eat free. if (user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe) and item_type == ewcfg.it_food: value = 0 if value > current_currency_amount: # Not enough money. response = "A {} costs {:,} {}, and you only have {:,}.".format(name, value, currency_used, current_currency_amount) else: mutations = user_data.get_mutations() if random.randrange(5) == 0 and ewcfg.mutation_id_stickyfingers in mutations: value = 0 if item_type == ewcfg.it_food: food_ordered = True food_items = bknd_item.inventory( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type_filter=ewcfg.it_food ) target = None target_data = None if not togo: # cant order togo for someone else, you can just give it to them in person if cmd.mentions_count == 1: target = cmd.mentions[0] if target.id == cmd.message.author.id: target = None if target != None: target_data = EwUser(member=target) if target_data.life_state == ewcfg.life_state_corpse and target_data.get_possession(): response = "How are you planning to feed them while they're possessing you?" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif target_data.poi != user_data.poi: response = "You can't order anything for them because they aren't here!" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if len(food_items) >= user_data.get_food_capacity() and target_data == None and togo: # user_data never got persisted so the player won't lose money unnecessarily response = "You can't carry any more food than that." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif item_type == ewcfg.it_weapon: weapons_held = bknd_item.inventory( id_user=user_data.id_user, id_server=cmd.guild.id, item_type_filter=ewcfg.it_weapon ) if len(weapons_held) >= user_data.get_weapon_capacity(): response = "You can't carry any more weapons." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif user_data.life_state == ewcfg.life_state_corpse: response = "Ghosts can't hold weapons." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: other_items_held = bknd_item.inventory( id_user=user_data.id_user, id_server=cmd.guild.id, item_type_filter=item_type ) if len(other_items_held) >= ewcfg.generic_inv_limit: response = ewcfg.str_generic_inv_limit.format(item_type) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) item_props = itm_utils.gen_item_props(item) # Only food should have the value multiplied. If someone togo orders a non-food item by mistake, lower it back down. if not food_ordered and togo: value = int(value / 1.5) if currency_used == 'slime': user_data.change_slimes(n=-value, source=ewcfg.source_spending) elif currency_used == 'brainz': user_data.gvs_currency -= value if company_data is not None: company_data.recent_profits += value company_data.persist() if item.str_name == "arcade cabinet": item_props['furniture_desc'] = random.choice(ewcfg.cabinets_list) elif item.item_type == ewcfg.it_furniture: if "custom" in item_props.get('id_furniture'): if cmd.tokens_count < 4 or cmd.tokens[2] == "" or cmd.tokens[3] == "": response = "You need to specify the customization text before buying a custom item. Come on, isn't that self-evident? (!order [custom item] \"custom name\" \"custom description\")" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: customname = cmd.tokens[2] if len(customname) > 32: response = "That name is too long. ({:,}/32)".format(len(customname)) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) customdesc = cmd.tokens[3] if len(customdesc) > 500: response = "That description is too long. ({:,}/500)".format(len(customdesc)) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) name = item_props['furniture_name'] = item_props['furniture_name'].format(custom=customname) item_props['furniture_desc'] = customdesc item_props['furniture_look_desc'] = item_props['furniture_look_desc'].format(custom=customname) item_props['furniture_place_desc'] = item_props['furniture_place_desc'].format(custom=customname) id_item = bknd_item.item_create( item_type=item_type, id_user=cmd.message.author.id, id_server=cmd.guild.id, stack_max=-1, stack_size=0, item_props=item_props ) if value == 0: response = "You swipe a {} from the counter at {}.".format(name, current_vendor) else: response = "You slam {:,} {} down on the counter at {} for {}.".format(value, currency_used, current_vendor, name) if food_ordered and not togo: item_data = EwItem(id_item=id_item) # Eat food on the spot! if target_data != None: target_player_data = EwPlayer(id_user=target_data.id_user) if value == 0: response = "You swipe a {} from the counter at {} and give it to {}.".format(name, current_vendor, target_player_data.display_name) else: response = "You slam {:,} slime down on the counter at {} for {} and give it to {}.".format(value, current_vendor, name, target_player_data.display_name) response += "\n\n*{}*: ".format(target_player_data.display_name) + target_data.eat(item_data) target_data.persist() asyncio.ensure_future(loop_utils.decrease_food_multiplier(user_data.id_user)) else: if value == 0: response = "You swipe a {} from the counter at {} and eat it right on the spot.".format(name, current_vendor) else: response = "You slam {:,} slime down on the counter at {} for {} and eat it right on the spot.".format(value, current_vendor, name) user_player_data = EwPlayer(id_user=user_data.id_user) response += "\n\n*{}*: ".format(user_player_data.display_name) + user_data.eat(item_data) user_data.persist() asyncio.ensure_future(loop_utils.decrease_food_multiplier(user_data.id_user)) if premium_purchase: user_data.time_lastpremiumpurchase = int(time.time()) user_data.persist() else: response = "Check the {} for a list of items you can {}.".format(ewcfg.cmd_menu, ewcfg.cmd_order) # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))