fast analysis if fresh

This commit is contained in:
Klemek
2021-04-07 15:09:10 +02:00
parent 91ae6ed383
commit ac782b4ea4
2 changed files with 44 additions and 16 deletions
+2
View File
@@ -105,6 +105,8 @@ python3 src/main.py
* **v1.12** * **v1.12**
* more scans: `%words` * more scans: `%words`
* concurrent `fast` analysis
* assume `fast` if last analysis is fresh
* **v1.11** * **v1.11**
* more scans: `%first`, `%rand`, `%last` * more scans: `%first`, `%rand`, `%last`
* streak computing in `%pres` * streak computing in `%pres`
+40 -14
View File
@@ -4,6 +4,7 @@ import discord
import json import json
import gzip import gzip
from datetime import datetime from datetime import datetime
import time
import logging import logging
import asyncio import asyncio
import threading import threading
@@ -22,6 +23,8 @@ current_analysis_lock = threading.Lock()
ALREADY_RUNNING = -100 ALREADY_RUNNING = -100
CANCELLED = -200 CANCELLED = -200
MIN_MODIFICATION_TIME = 5 * 60
class Worker: class Worker:
def __init__(self, channel_log: ChannelLogs, channel: discord.TextChannel): def __init__(self, channel_log: ChannelLogs, channel: discord.TextChannel):
@@ -61,6 +64,22 @@ class GuildLogs:
def check_cancelled(self) -> bool: def check_cancelled(self) -> bool:
return self.locked and self.log_file not in current_analysis return self.locked and self.log_file not in current_analysis
def lock(self) -> bool:
self.locked = True
current_analysis_lock.acquire()
if self.log_file in current_analysis:
current_analysis_lock.release()
return False
current_analysis.append(self.log_file)
current_analysis_lock.release()
return True
def unlock(self):
self.locked = False
current_analysis_lock.acquire()
current_analysis.remove(self.log_file)
current_analysis_lock.release()
async def load( async def load(
self, self,
progress: discord.Message, progress: discord.Message,
@@ -70,21 +89,17 @@ class GuildLogs:
fresh: bool, fresh: bool,
) -> Tuple[int, int]: ) -> Tuple[int, int]:
self.locked = False self.locked = False
if not fast: if not fast and not self.lock():
self.locked = True
current_analysis_lock.acquire()
if self.log_file in current_analysis:
current_analysis_lock.release()
return ALREADY_RUNNING, 0 return ALREADY_RUNNING, 0
current_analysis.append(self.log_file)
current_analysis_lock.release()
t00 = datetime.now() t00 = datetime.now()
# read logs # read logs
if not os.path.exists(LOG_DIR): if not os.path.exists(LOG_DIR):
os.mkdir(LOG_DIR) os.mkdir(LOG_DIR)
last_time = None
if os.path.exists(self.log_file): if os.path.exists(self.log_file):
channels = {} channels = {}
try: try:
last_time = os.path.getmtime(self.log_file)
gziped_data = None gziped_data = None
await code_message(progress, "Reading saved history (1/4)...") await code_message(progress, "Reading saved history (1/4)...")
t0 = datetime.now() t0 = datetime.now()
@@ -140,6 +155,23 @@ class GuildLogs:
else: else:
target_channels = target_channels_tmp target_channels = target_channels_tmp
# assume fast if file is fresh
if (
not fast
and not fresh
and last_time is not None
and (time.time() - last_time) < MIN_MODIFICATION_TIME
):
invalid_target_channels = [
channel
for channel in target_channels
if channel.id not in self.channels
]
if len(invalid_target_channels) == 0:
fast = True
if self.locked:
self.unlock()
total_msg = 0 total_msg = 0
total_chan = 0 total_chan = 0
if fast: if fast:
@@ -153,14 +185,8 @@ class GuildLogs:
) )
total_chan = len(target_channels) total_chan = len(target_channels)
else: else:
if not self.locked: if not self.locked and not self.lock():
self.locked = True
current_analysis_lock.acquire()
if self.log_file in current_analysis:
current_analysis_lock.release()
return ALREADY_RUNNING, 0 return ALREADY_RUNNING, 0
current_analysis.append(self.log_file)
current_analysis_lock.release()
# load channels # load channels
t0 = datetime.now() t0 = datetime.now()
loading_new = 0 loading_new = 0