def handle_rpcd_message(client, tokens, message, server, profile, msg, help=None, error=None): if (error and not isinstance(error, str)) or not msg: original_tokens = tokenize(message.content[:250], preserve_case=True) return ErrorMessage(f"`{' '.join(original_tokens)}` could not be parsed as a valid command.") elif error: return ErrorMessage(error) return msg
def logs(client, tokens, message, server, profile, msg, help=None): """ # Logs Help Ask for the future log value of your current inventory! «You may need to know how many logs you will have in A10 before you can decide whether you should progress to the next area. This command will tell you how many logs you will have in area 10 based on your current inventory.» The command assumes you are in A5 if no area is provided. ## Usage • `rcd logs [a{n}=a5] [@player=@you]` ## Examples • `rcd logs` assuming that I am in A5, how many logs am I gonna have in A10? • `rcd logs a7` now that I am in A7, how many logs am I gonna have in A10? • `rcd logs @kevin` how many logs is Kevin gonna have in area A10? """ if help or not tokens: return {"msg": HelpMessage(logs.__doc__)} full_message, metadata = " ".join(tokens), {"area": 5} area_indicator = re.search(r" ([aA])?(\d{1,2})", full_message) if area_indicator: area = int(area_indicator.groups()[1]) start, end = area_indicator.span() tokens, metadata["area"] = tokenize(f"{full_message[0:start]}{full_message[end:]}"), area if not 1 <= metadata["area"] <= 15: return {"msg": ErrorMessage("Only areas 1-15 are valid!", title="Logs Error")} mentioned_profile = Profile.from_tag(tokens[-1], client, server, message) if mentioned_profile: profile, metadata["snoop"] = mentioned_profile, profile.uid open_sentinels = list(Sentinel.objects.filter(trigger=0, profile=profile, action="logs")) len(open_sentinels) == 0 and Sentinel.objects.create(trigger=0, profile=profile, action="logs", metadata=metadata) for sentinel in open_sentinels: sentinel.metadata.get("snoop", -1) == metadata.get("snoop", -1) and sentinel.update(metadata=metadata) _area = f'Area {metadata["area"]}' if metadata.get("snoop", None): return { "msg": NormalMessage( "Busybody, eh? Okay, I'll check next time they open their inventory.", title=f"Snoop Lawgs ({_area})" ) } return { "msg": NormalMessage( "Okay, the next time I see your inventory, I'll say how many logs you should have in Area 10.", title=f"Logs ({_area})", ) }
def handle_rcd_command( client, tokens, message, server, profile, msg, help=None, error=None, coro=None ) -> HandlerResult: _msg, _coro = msg, (None, ()) if (error and not isinstance(error, str)) or not msg: original_tokens = tokenize(message.content[:250], preserve_case=True) _msg = ErrorMessage(f"`{' '.join(original_tokens)}` could not be parsed as a valid command.") elif error: _msg = ErrorMessage(error) if coro and inspect.iscoroutinefunction(coro[0]): _coro = coro return [_msg], _coro
def timezone(client, tokens, message, server, profile, msg, help=None): """ # Timezone Help Set your timezone. This only effects the time displayed in `rcd cd`; notification functionality is not effected. ## Usage • `rcd timezone <timezone>`: Sets your timezone to the provided timezone ## Examples • `rcd timezone America/Chicago`: Sets your timezone to America/Chicago • `rcd tz default` Sets your timezone back to the default. """ current_time = datetime.datetime.now().astimezone(pytz.timezone(profile.timezone)) if help or len(tokens) == 1: return { "msg": HelpMessage( timezone.__doc__, fields=[ ( "Info", f"Current time with your time format `{profile.time_format}` " f"in your timezone `{profile.timezone}` is {current_time.strftime(profile.time_format)}. \n" f"[Visit this page to see a list of timezones.](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)", ) ], ) } if len(tokens) == 2: # need case sensitive tokens to get correct timezone name, # need case insensitive tokens to get relative position in of # tz|timezone token from user input tokens = tokenize(message.content[:250], preserve_case=True) tz = tokens[-1] if tz.lower() == "default": tz = Profile.DEFAULT_TIMEZONE elif tz not in set(map(lambda x: x[0], Profile.TIMEZONE_CHOICES)): return {"msg": ErrorMessage(f"{tz} is not a valid timezone.")} else: profile.update(timezone=tz) return { "msg": SuccessMessage( f"**{message.author.name}'s** timezone has been set to **{tz}**.", fields=[ ( "Info", f"Current time with your time format `{profile.time_format}` " f"in your timezone `{profile.timezone}` is {current_time.strftime(profile.time_format)}. ", ) ], ) }
def timeformat(client, tokens, message, server, profile, msg, help=None): """ # Time Format Help «Set the time format for the output of `rcd` using Python `strftime` notation. Defaults to `%I:%M:%S %p, %m/%d`. If you don't know what that means, see the linked resource below.» ## Usage • `rcd timeformat|tf "<format_string>"` ##Examples • `rcd timeformat "%I:%M:%S %p, %m/%d"` **Notice the quotes.** Very important! • `rcd tf "%Y-%m-%d %H:%M:%S"` • `rcd tf default` Restore your time format to default. """ itokens = tokenize(message.content[:250], preserve_case=True) current_time = datetime.datetime.now().astimezone(pytz.timezone(profile.timezone)).strftime(profile.time_format) if help or len(tokens) == 1: return { "msg": HelpMessage( timeformat.__doc__, fields=[ ( "Info", f"Current time with your time format `{profile.time_format}` " f"in your timezone `{profile.timezone}` is {current_time}. \n" "[Visit here for documentation on time format strings.]" "(https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes)", ) ], ) } elif len(tokens) != 2: return { "msg": ErrorMessage( f"Could not parse {' '.join(itokens)} as a valid timeformat command; " "your input had more arguments than epected. " "Did you make sure to quote your format string?", title="Parse Error", ) } # ensure tokens and itokens are the same lenth. time_format = itokens[-1] if len(time_format) > Profile.MAX_TIME_FORMAT_LENGTH: return { "msg": ErrorMessage( f"Your specified time format `{timeformat}` is too long. " f"It should have {len(time_format) - Profile.MAX_TIME_FORMAT_LENGTH} " "fewer characters.", title="Are you being naughty?", ) } if time_format.lower() == "default": time_format = Profile.DEFAULT_TIME_FORMAT try: current_time = datetime.datetime.now().astimezone(pytz.timezone(profile.timezone)).strftime(time_format) profile.update(time_format=time_format) return { "msg": SuccessMessage( f"Great! You set your time format to `{time_format}`. " f"The current time is {current_time}", title="Good job!", ) } except Exception as e: # I honestly am not sure if this is possible return { "msg": ErrorMessage( f"Great... Your time format `{time_format}` broke something; " f"err = {e}", "Oh boy Oh geez" ) }
def __init__(self, client, incoming, server=None): super().__init__(client, incoming, server) tokens = tokenize(self.content) if tokens and tokens[0] == "rpg": self.tokens = tokens[1:]
async def on_message(self, message): if message.author == self.user: return server = await get_instance(Server, id=message.channel.guild.id) if server and not server.active: return content = message.content[:150].lower() if content.startswith("rpgcd") or content.startswith("rcd"): if content.startswith("rcd"): tokens = tokenize(message.content[3:]) if tokens and tokens[0] == "scrape": limit = None if len(tokens) == 2 and tokens[1].isdigit(): limit = int(tokens[1]) async for m in message.channel.history(limit=limit): logger = await log_message(m) return await logger.shutdown() else: tokens = tokenize(message.content[5:]) msg = await handle_rpcd_message(self, tokens, message, server, None, None) embed = msg.to_embed() await message.channel.send(embed=embed) if not server: return # we want to pull the results of Epic RPG's cooldown message if str(message.author) == "EPIC RPG#4117": return await process_rpg_messages(self, server, message) if content.startswith("rpg"): cooldown_type, after = CoolDown.cd_from_command( message.content[3:]) if not cooldown_type: return profile, _ = await get_instance( Profile, uid=message.author.id, defaults={ "last_known_nickname": message.author.name, "server": server, "channel": message.channel.id, }, ) if profile.server_id != server.id or profile.channel != message.channel.id: profile = await update_instance(profile, server_id=server.id, channel=message.channel.id) if cooldown_type == "guild": return await set_guild_cd(profile) elif cooldown_type in {"hunt", "adventure"}: _, _ = await get_instance(Hunt, profile_id=profile.uid, target=None, defaults={"target": None}) await upsert_cooldowns( [CoolDown(profile=profile, type=cooldown_type, after=after)])
def __init__(self, clint, incoming, server=None): super().__init__(clint, incoming, server) tokens = tokenize(self.content) if tokens and tokens[0] in ["rcd", "rrd"]: self.tokens = ["rd", *tokens[1:]] if tokens[0] == "rrd" else tokens[1:] self.tokens = ["cd"] if not self.tokens else self.tokens