broke out the cancellation tallying logic and started saving messages to a sqlite3 database

This commit is contained in:
2021-08-01 16:44:23 -05:00
parent b15a2de24e
commit f497ba43a8
2 changed files with 183 additions and 44 deletions

View File

@@ -4,31 +4,16 @@ import re
import discord
import nltk
import pandas as pd
import stockquotes
from dotenv import load_dotenv
from msg import get_and_save, cancellations, cancelled_totals, report_string
logging.basicConfig(level=logging.INFO)
LIL_STINKY_ID = 704043422276780072
def cancelled_totals(df):
totals = df.groupby('display_name')['cancelled'].sum().sort_values(ascending=False)
name_width = df['display_name'].apply(str).apply(len).max()
df2 = df.groupby(['display_name', 'channel']).sum().reset_index().groupby('display_name').max()
df2.columns = ['channel most cancelled', 'channel cancel count']
df2['total cancelled'] = df2.index.to_series().apply(lambda n: df[df['display_name'] == n]['cancelled'].sum())
df2['link'] = df2.index.to_series().apply(lambda n: df[df['channel'] == df2.loc[n].iloc[0]]['channel link'].iloc[0])
res = 'Cancellation totals:\n'
res += '\n'.join(
f'`{total} {name.ljust(name_width)}` most in {df2.loc[name, "link"]}' for name, total in totals.iteritems()
)
return res
class RoboPage(discord.Client):
def __init__(self, *args, **kwargs):
super(RoboPage, self).__init__(*args, **kwargs)
@@ -38,7 +23,10 @@ class RoboPage(discord.Client):
AssJoke(),
DominosJoke()
]
print()
self.db_path = 'messages.db'
def run(self):
return super().run(os.getenv('DISCORD_TOKEN'))
async def reaction_messages(self, target: str, **kwargs):
for c in self.get_all_channels():
@@ -53,26 +41,6 @@ class RoboPage(discord.Client):
print(r.count, m.author.display_name)
yield m, r.count
async def get_cancelled_totals(self, limit=1000):
df = pd.DataFrame(
[{
'display_name': m.author.display_name,
'cancelled': count,
'message': m.content,
'channel': m.channel.name,
'channel link': f'<#{m.channel.id}>',
'link': m.jump_url
}
async for m, count in self.reaction_messages('cancelled', limit=limit)]
)
df.to_csv('msgs.csv', index=False)
return cancelled_totals(df)
def run(self):
return super().run(os.getenv('DISCORD_TOKEN'))
async def handle_ready(self):
channel: discord.TextChannel = discord.utils.get(self.get_all_channels(), name='robotics-facility')
await channel.send(f"I'm aliiiiiive {discord.utils.get(self.emojis, name='kaylon')}")
@@ -88,6 +56,11 @@ class RoboPage(discord.Client):
print(f'{joke.__class__.__name__} detected:\n{message.content}\n{scan_res}')
await joke.respond(message, self, scan_res)
async def get_cancelled_totals(self, limit=1000, days: int = 90):
msg_df, react_df = await get_and_save('messages.db', client=self, limit=limit, days=days)
res = cancelled_totals(cancellations(msg_df, react_df, days=days))
return report_string(res.iloc[:5])
class Joke:
@property
@@ -159,6 +132,7 @@ class DominosJoke(Joke):
pattern = 'NP: {<DT>?<JJ>*<NN>}'
cp = nltk.RegexpParser(pattern)
def token_list(s):
return nltk.chunk.tree2conlltags(
cp.parse(
@@ -172,9 +146,9 @@ def assify(s):
for i, (text, tag, iob) in enumerate(tag_list):
if text[-3:].lower() == 'ass':
try:
next_tag = tag_list[i+1][1]
next_tag = tag_list[i + 1][1]
if next_tag == 'NN' or next_tag == 'NNS':
return f'ass-{tag_list[i+1][0]}'
return f'ass-{tag_list[i + 1][0]}'
except IndexError as e:
return
@@ -184,25 +158,26 @@ def unblack(s):
for i, (text, tag, iob) in enumerate(tag_list):
if text.lower() == 'black':
if tag.startswith('JJ') or tag.startswith('NN'):
for text, tag, iob in tag_list[i+1:]:
for text, tag, iob in tag_list[i + 1:]:
if tag.startswith('NN'):
return f'Or as I would say, {text.lower()}'
if __name__ == '__main__':
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
client = RoboPage()
@client.event
async def on_ready():
print(f'{client.user} has connected to Discord!')
await client.handle_ready()
# print(await client.get_cancelled_totals(limit=100))
# await client.handle_ready()
@client.event
async def on_message(message: discord.Message):
await client.handle_message(message)
client.run()