Add ability to have activity log ignore channels, closes #173

This commit is contained in:
Zeva Rose 2022-08-15 15:44:28 -06:00
parent f3974d172f
commit 1bc99520db
3 changed files with 71 additions and 9 deletions

View file

@ -110,12 +110,13 @@ class Jarvis(StatsClient):
async def _prerun(self, ctx: Context, *args, **kwargs) -> None: async def _prerun(self, ctx: Context, *args, **kwargs) -> None:
name = ctx.invoke_target name = ctx.invoke_target
cargs = ""
if isinstance(ctx, InteractionContext) and ctx.target_id: if isinstance(ctx, InteractionContext) and ctx.target_id:
kwargs["context target"] = ctx.target kwargs["context target"] = ctx.target
args = " ".join(f"{k}:{v}" for k, v in kwargs.items()) cargs = " ".join(f"{k}:{v}" for k, v in kwargs.items())
elif isinstance(ctx, PrefixedContext): elif isinstance(ctx, PrefixedContext):
args = " ".join(args) cargs = " ".join(args)
self.logger.debug(f"Running command `{name}` with args: {args or 'None'}") self.logger.debug(f"Running command `{name}` with args: {cargs or 'None'}")
async def _sync_domains(self) -> None: async def _sync_domains(self) -> None:
self.logger.debug("Loading phishing domains") self.logger.debug("Loading phishing domains")
@ -232,7 +233,8 @@ class Jarvis(StatsClient):
name = ctx.invoke_target name = ctx.invoke_target
if not isinstance(ctx.channel, DMChannel) and name not in ["pw"]: if not isinstance(ctx.channel, DMChannel) and name not in ["pw"]:
modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="activitylog")) modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="activitylog"))
if modlog: ignore = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore"))
if modlog and (ignore and ctx.channel.id not in ignore.value):
channel = await ctx.guild.fetch_channel(modlog.value) channel = await ctx.guild.fetch_channel(modlog.value)
args = [] args = []
if isinstance(ctx, InteractionContext) and ctx.target_id: if isinstance(ctx, InteractionContext) and ctx.target_id:
@ -702,7 +704,8 @@ class Jarvis(StatsClient):
after = event.after after = event.after
if not after.author.bot: if not after.author.bot:
modlog = await Setting.find_one(q(guild=after.guild.id, setting="activitylog")) modlog = await Setting.find_one(q(guild=after.guild.id, setting="activitylog"))
if modlog: ignore = await Setting.find_one(q(guild=after.guild.id, setting="log_ignore"))
if modlog and (ignore and after.channel.id not in ignore.value):
if not before or before.content == after.content or before.content is None: if not before or before.content == after.content or before.content is None:
return return
try: try:
@ -754,7 +757,8 @@ class Jarvis(StatsClient):
"""Process on_message_delete events.""" """Process on_message_delete events."""
message = event.message message = event.message
modlog = await Setting.find_one(q(guild=message.guild.id, setting="activitylog")) modlog = await Setting.find_one(q(guild=message.guild.id, setting="activitylog"))
if modlog: ignore = await Setting.find_one(q(guild=message.guild.id, setting="log_ignore"))
if modlog and (ignore and message.channel.id not in ignore.value):
try: try:
content = message.content or "N/A" content = message.content or "N/A"
except AttributeError: except AttributeError:

View file

@ -5,7 +5,7 @@ from typing import Any
from jarvis_core.db import q from jarvis_core.db import q
from jarvis_core.db.models import Setting from jarvis_core.db.models import Setting
from naff import Client, Extension, InteractionContext from naff import AutocompleteContext, Client, Extension, InteractionContext
from naff.models.discord.channel import GuildText from naff.models.discord.channel import GuildText
from naff.models.discord.components import ActionRow, Button, ButtonStyles from naff.models.discord.components import ActionRow, Button, ButtonStyles
from naff.models.discord.embed import EmbedField from naff.models.discord.embed import EmbedField
@ -17,6 +17,7 @@ from naff.models.naff.application_commands import (
slash_option, slash_option,
) )
from naff.models.naff.command import check from naff.models.naff.command import check
from thefuzz import process
from jarvis.utils import build_embed from jarvis.utils import build_embed
from jarvis.utils.permissions import admin_or_permissions from jarvis.utils.permissions import admin_or_permissions
@ -152,6 +153,29 @@ class SettingsCog(Extension):
await self.update_settings("notify", active, ctx.guild.id) await self.update_settings("notify", active, ctx.guild.id)
await ctx.send(f"Settings applied. Notifications active: {active}") await ctx.send(f"Settings applied. Notifications active: {active}")
@set_.subcommand(
sub_cmd_name="log_ignore", sub_cmd_description="Ignore a channel for ActivityLog"
)
@slash_option(
name="channel", description="Channel to ignore", opt_type=OptionTypes.CHANNEL, required=True
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _add_log_ignore(self, ctx: InteractionContext, channel: GuildText) -> None:
if not isinstance(channel, GuildText):
await ctx.send("Channel must be a GuildText", ephemeral=True)
return
setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore"))
if not setting:
setting = Setting(guild=ctx.guild.id, setting="log_ignore", value=[])
if not setting.value:
setting.value = []
if channel in setting.value:
await ctx.send("Channel already ignored", ephemeral=True)
return
setting.value.append(channel.id)
await setting.commit()
await ctx.send("Channel added to ActivityLog ignore list")
# Unset # Unset
@unset.subcommand( @unset.subcommand(
sub_cmd_name="modlog", sub_cmd_name="modlog",
@ -210,6 +234,37 @@ class SettingsCog(Extension):
await self.delete_settings("notify", ctx.guild.id) await self.delete_settings("notify", ctx.guild.id)
await ctx.send("Setting `notify` unset") await ctx.send("Setting `notify` unset")
@unset.subcommand(
sub_cmd_name="log_ignore", sub_cmd_description="Add a channel for ActivityLog"
)
@slash_option(
name="channel",
description="Channel to stop ignoring",
opt_type=OptionTypes.STRING,
required=True,
autocomplete=True,
)
@check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _remove_log_ignore(self, ctx: InteractionContext, channel: str) -> None:
channel = int(channel)
setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore"))
if not setting or channel not in setting.value:
await ctx.send("Channel not being ignored", ephemeral=True)
return
setting.value.remove(channel)
await setting.commit(replace=True)
await ctx.send("Channel no longer being ignored")
@_remove_log_ignore.autocomplete(option_name="channel")
async def _channel_search(self, ctx: AutocompleteContext, channel: str) -> None:
setting = await Setting.find_one(q(guild=ctx.guild.id, setting="log_ignore"))
if not setting:
return {}
channels = [ctx.guild.get_channel(x) for x in setting.value]
channels = {c.name: c.id for c in channels}
options = process.extract(channel, list(channels.keys()), limit=25)
await ctx.send(choices=[{"name": c[0], "value": str(channels[c[0]])} for c in options])
@settings.subcommand(sub_cmd_name="view", sub_cmd_description="View settings") @settings.subcommand(sub_cmd_name="view", sub_cmd_description="View settings")
@check(admin_or_permissions(Permissions.MANAGE_GUILD)) @check(admin_or_permissions(Permissions.MANAGE_GUILD))
async def _view(self, ctx: InteractionContext) -> None: async def _view(self, ctx: InteractionContext) -> None:

7
poetry.lock generated
View file

@ -514,7 +514,7 @@ python-versions = "*"
[[package]] [[package]]
name = "naff" name = "naff"
version = "1.7.1" version = "1.8.0"
description = "Not another freaking fork" description = "Not another freaking fork"
category = "main" category = "main"
optional = false optional = false
@ -1564,7 +1564,10 @@ mypy-extensions = [
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
] ]
naff = [] naff = [
{file = "naff-1.8.0-py3-none-any.whl", hash = "sha256:96284f17841a782bdf4cb1e0b767b75e93a0afb9c0cd852a448e9a475b38efb6"},
{file = "naff-1.8.0.tar.gz", hash = "sha256:0fada9174642d6daa5b76f2e52c992722ffc8219ba9067b101d018380df1ad24"},
]
nafftrack = [] nafftrack = []
nanoid = [ nanoid = [
{file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"}, {file = "nanoid-2.0.0-py3-none-any.whl", hash = "sha256:90aefa650e328cffb0893bbd4c236cfd44c48bc1f2d0b525ecc53c3187b653bb"},