cancel command

This commit is contained in:
klemek
2021-01-13 15:25:02 +01:00
parent e106ed4e41
commit e02516677a
4 changed files with 52 additions and 5 deletions
+36 -1
View File
@@ -16,6 +16,10 @@ LOG_DIR = "logs"
current_analysis = []
ALREADY_RUNNING = -100
CANCELLED = -200
class GuildLogs:
def __init__(self, guild: discord.Guild):
self.guild = guild
@@ -25,6 +29,9 @@ class GuildLogs:
def dict(self) -> dict:
return {id: self.channels[id].dict() for id in self.channels}
def check_cancelled(self) -> bool:
return self.log_file not in current_analysis
async def load(
self,
progress: discord.Message,
@@ -34,7 +41,7 @@ class GuildLogs:
) -> Tuple[int, int]:
global current_analysis
if self.log_file in current_analysis:
return -1, -1
return ALREADY_RUNNING, 0
current_analysis += [self.log_file]
t00 = datetime.now()
# read logs
@@ -49,16 +56,22 @@ class GuildLogs:
with open(self.log_file, mode="rb") as f:
gziped_data = f.read()
logging.info(f"log {self.guild.id} > read in {delta(t0):,}ms")
if self.check_cancelled():
return CANCELLED, 0
await code_message(progress, "Reading saved history (2/4)...")
t0 = datetime.now()
json_data = gzip.decompress(gziped_data)
logging.info(
f"log {self.guild.id} > gzip decompress in {delta(t0):,}ms"
)
if self.check_cancelled():
return CANCELLED, 0
await code_message(progress, "Reading saved history (3/4)...")
t0 = datetime.now()
channels = json.loads(json_data)
logging.info(f"log {self.guild.id} > json parse in {delta(t0):,}ms")
if self.check_cancelled():
return CANCELLED, 0
await code_message(progress, "Reading saved history (4/4)...")
t0 = datetime.now()
self.channels = {int(id): ChannelLogs(channels[id]) for id in channels}
@@ -103,6 +116,8 @@ class GuildLogs:
queried_msg = 0
total_chan = 0
max_chan = len(target_channels)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Reading new history...\n0 messages in 0/{max_chan:,} channels\n(this might take a while)",
@@ -123,6 +138,8 @@ class GuildLogs:
warning_msg = (
"(some channels are new, this might take a long while)"
)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Reading new history...\n{tmp_msg:,} messages in {total_chan + 1:,}/{max_chan:,} channels ({round(tmp_queried_msg/deltas(t0)):,}m/s)\n{warning_msg}",
@@ -139,6 +156,8 @@ class GuildLogs:
[len(channel.messages) for channel in self.channels.values()]
)
real_total_chan = len(self.channels)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Saving history (1/3)...\n{real_total_msg:,} messages in {real_total_chan:,} channels",
@@ -148,6 +167,8 @@ class GuildLogs:
logging.info(
f"log {self.guild.id} > json dump in {delta(t0):,}ms -> {real_total_msg / deltas(t0):,.3f} m/s"
)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Saving history (2/3)...\n{real_total_msg:,} messages in {real_total_chan:,} channels",
@@ -157,6 +178,8 @@ class GuildLogs:
logging.info(
f"log {self.guild.id} > gzip in {delta(t0):,}ms -> {real_total_msg / deltas(t0):,.3f} m/s"
)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Saving history (3/3)...\n{real_total_msg:,} messages in {real_total_chan:,} channels",
@@ -167,6 +190,8 @@ class GuildLogs:
logging.info(
f"log {self.guild.id} > saved in {delta(t0):,}ms -> {real_total_msg / deltas(t0):,.3f} m/s"
)
if self.check_cancelled():
return CANCELLED, 0
await code_message(
progress,
f"Analysing...\n{total_msg:,} messages in {total_chan:,} channels",
@@ -174,3 +199,13 @@ class GuildLogs:
logging.info(f"log {self.guild.id} > TOTAL TIME: {delta(t00):,}ms")
current_analysis.remove(self.log_file)
return total_msg, total_chan
@staticmethod
async def cancel(client: discord.client, message: discord.Message, *args: str):
logs = GuildLogs(message.guild)
if logs.log_file in current_analysis:
current_analysis.remove(logs.log_file)
else:
await message.channel.send(
f"No analysis are currently running on this server", reference=message
)