def get_userlog_embed_for_id(self, uid: str, name: str, own: bool = False, event=""): own_note = " Good for you!" if own else "" wanted_events = ["warns", "bans", "kicks", "mutes", "notes"] if event and not isinstance(event, list): wanted_events = [event] embed = discord.Embed(color=discord.Color.dark_red()) embed.set_author(name=f"Userlog for {name}") userlog = get_userlog() if uid not in userlog: embed.description = f"There are none!{own_note} (no entry)" embed.color = discord.Color.green() return embed for event_type in wanted_events: if event_type in userlog[uid] and userlog[uid][event_type]: event_name = userlog_event_types[event_type] for idx, event in enumerate(userlog[uid][event_type]): issuer = "" if own else f"Issuer: {event['issuer_name']} "\ f"({event['issuer_id']})\n" embed.add_field(name=f"{event_name} {idx + 1}: " f"{event['timestamp']}", value=issuer + f"Reason: {event['reason']}", inline=False) if not own and "watch" in userlog[uid]: watch_state = "" if userlog[uid]["watch"] else "NOT " embed.set_footer(text=f"User is {watch_state}under watch.") if not embed.fields: embed.description = f"There are none!{own_note}" embed.color = discord.Color.green() return embed
async def resolved(self, ctx): """Marks your last mod mail message as resolved""" # We should probably delete the message for privacy. await ctx.message.delete() logs = get_userlog() uid = str(ctx.author.id) if uid not in logs or "mail" not in logs[uid] or len( logs[uid]["mail"]) == 0: await ctx.send("No mod mail message to mark as resolved.") return if logs[uid]["mail"][-1]["resolved"]: await ctx.send( "Last mod mail message is already marked as resolved.") return logs[uid]["mail"][-1]["resolved"] = True set_userlog(json.dumps(logs)) modmail_channel = self.bot.get_channel(config.modmail_channel) message = await modmail_channel.fetch_message( logs[uid]["mail"][-1]["message_id"]) await message.edit( embed=self.build_embed(ctx.author, logs[uid]["mail"][-1])) await ctx.send(f"{ctx.author.mention} - Message marked as resolved.")
def get_stats_for_id(self, uid: int, events: list): userlog = get_userlog() results = { "warns": None, "mutes": None, "kicks": None, "bans": None, "notes": None } for event in events: results[event] = 0 if len(userlog.values()) == 0: return results for logs in userlog.values(): for event in events: if event not in logs: continue for loggedEvent in logs[event]: if uid == loggedEvent["issuer_id"]: results[event] += 1 return results
async def modmail(self, ctx, *, body: str = ""): """Sends a mod mail message""" # We should probably delete the message for privacy. if ctx.guild: await ctx.message.delete() # Prevent sending of blank messages. if len(body.strip()) == 0: await ctx.send("A message can not be empty.") return if len(body.strip()) > 2048: await ctx.send("A message can not be longer than 2048 characters.") return logs = get_userlog() uid = str(ctx.author.id) # Get the timeout from the config and default it to 15 seconds. timeout = getattr(config, "modmail_timeout", 15) # Make sure our user exists in the userlog, and they've sent a message before. if uid in logs and "mail" in logs[uid] and len(logs[uid]["mail"]) != 0: last_message = logs[uid]["mail"][-1] # Prevents sending the same message. if last_message["body"].strip() == body.strip(): await ctx.send("Unable to send message.") return # Rate limit messages. delta_time = int(time.time()) - last_message["timestamp"] if delta_time < timeout: await ctx.send( f"Please wait {timeout - delta_time} seconds before sending another message." ) return message = { "body": body.strip(), "timestamp": int(time.time()), "resolved": False, "replier_id": 0, "replier_name": "", "message_id": 0, } # Send message modmail_channel = self.bot.get_channel(config.modmail_channel) message["message_id"] = (await modmail_channel.send( embed=self.build_embed(ctx.author, message))).id # Log messages to the userlog. self.add_mail_log(uid, message) await ctx.send(f"{ctx.author.mention} - Message sent.")
def add_mail_log(self, uid, message): userlogs = get_userlog() uid = str(uid) if uid not in userlogs: userlogs[uid] = get_blank_userlog() userlogs[uid]["mail"].append(message) set_userlog(json.dumps(userlogs))
def clear_event_from_id(self, uid: str, event_type): userlog = get_userlog() if uid not in userlog: return f"<@{uid}> has no {event_type}!" event_count = len(userlog[uid][event_type]) if not event_count: return f"<@{uid}> has no {event_type}!" userlog[uid][event_type] = [] set_userlog(json.dumps(userlog)) return f"<@{uid}> no longer has any {event_type}!"
def delete_event_from_id(self, uid: str, idx: int, event_type): userlog = get_userlog() if uid not in userlog: return f"<@{uid}> has no {event_type}!" event_count = len(userlog[uid][event_type]) if not event_count: return f"<@{uid}> has no {event_type}!" if idx > event_count: return "Index is higher than "\ f"count ({event_count})!" if idx < 1: return "Index is below 1!" event = userlog[uid][event_type][idx - 1] event_name = userlog_event_types[event_type] embed = discord.Embed(color=discord.Color.dark_red(), title=f"{event_name} {idx} on " f"{event['timestamp']}", description=f"Issuer: {event['issuer_name']}\n" f"Reason: {event['reason']}") del userlog[uid][event_type][idx - 1] set_userlog(json.dumps(userlog)) return embed