moved start logic into Kwaylon class
This commit is contained in:
@@ -1,12 +1,18 @@
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import AsyncIterator, List
|
from typing import AsyncIterator, List
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from discord import (Client, Emoji, Guild, Message, RawReactionActionEvent,
|
from discord import (Client, Emoji, Guild, Intents, Message,
|
||||||
TextChannel, utils)
|
RawReactionActionEvent, TextChannel, utils)
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.highlighter import NullHighlighter
|
||||||
|
from rich.logging import RichHandler
|
||||||
|
|
||||||
from . import jokes
|
from . import jokes
|
||||||
|
|
||||||
@@ -36,7 +42,46 @@ class Kwaylon(Client):
|
|||||||
self.robotics_facility_dev: TextChannel = await self.fetch_channel(DEV_ROBOTICS_FACILITY_ID)
|
self.robotics_facility_dev: TextChannel = await self.fetch_channel(DEV_ROBOTICS_FACILITY_ID)
|
||||||
self.kaylon_emoji: Emoji = utils.get(self.emojis, name='kaylon')
|
self.kaylon_emoji: Emoji = utils.get(self.emojis, name='kaylon')
|
||||||
# await alive(self.robotics_facility)
|
# await alive(self.robotics_facility)
|
||||||
_log.info('[bold bright_green]Done[/][bright_black], laying in wait...[/]')
|
_log.info(
|
||||||
|
'[bold bright_green]Done[/][bright_black], laying in wait...[/]')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def create_and_start(cls, token: str, log_level: int = logging.INFO):
|
||||||
|
rich_handler = RichHandler(
|
||||||
|
console=Console(width=150),
|
||||||
|
highlighter=NullHighlighter(),
|
||||||
|
markup=True,
|
||||||
|
rich_tracebacks=True,
|
||||||
|
tracebacks_suppress=['pandas', 'discord'],
|
||||||
|
)
|
||||||
|
dt_fmt = '%Y-%m-%d %I:%M:%S %p'
|
||||||
|
# https://docs.python.org/3/library/logging.html#logrecord-attributes
|
||||||
|
log_format = '[magenta]%(name)s[/] [cyan]%(funcName)s[/] %(message)s'
|
||||||
|
formatter = logging.Formatter(log_format, dt_fmt)
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=log_level,
|
||||||
|
format=log_format,
|
||||||
|
datefmt=dt_fmt,
|
||||||
|
handlers=[rich_handler]
|
||||||
|
)
|
||||||
|
logging.getLogger('discord.http').setLevel(logging.WARNING)
|
||||||
|
logging.getLogger('discord.gateway').setLevel(logging.WARNING)
|
||||||
|
|
||||||
|
intents = Intents.default()
|
||||||
|
intents.message_content = True
|
||||||
|
client = cls(intents=intents)
|
||||||
|
|
||||||
|
@client.event
|
||||||
|
async def on_ready():
|
||||||
|
await client.initialize()
|
||||||
|
|
||||||
|
@client.event
|
||||||
|
async def on_message(message: Message):
|
||||||
|
await client.handle_message(message)
|
||||||
|
|
||||||
|
async with client:
|
||||||
|
await client.start(token, reconnect=True)
|
||||||
|
|
||||||
async def handle_message(self, message: Message):
|
async def handle_message(self, message: Message):
|
||||||
if message.author != self.user:
|
if message.author != self.user:
|
||||||
@@ -53,7 +98,8 @@ class Kwaylon(Client):
|
|||||||
try:
|
try:
|
||||||
await joke.respond(message, self, joke_match)
|
await joke.respond(message, self, joke_match)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
_log.error(f'[bold red]{type(e).__name__}[/] when responding to [cyan1]{type(joke).__name__}[/]')
|
_log.error(
|
||||||
|
f'[bold red]{type(e).__name__}[/] when responding to [cyan1]{type(joke).__name__}[/]')
|
||||||
raise
|
raise
|
||||||
|
|
||||||
async def read_command(self, message: Message):
|
async def read_command(self, message: Message):
|
||||||
@@ -154,6 +200,7 @@ def log_info():
|
|||||||
for handler in logger.handlers:
|
for handler in logger.handlers:
|
||||||
print(f' - {str(handler.__class__)[8:-2]}')
|
print(f' - {str(handler.__class__)[8:-2]}')
|
||||||
|
|
||||||
|
|
||||||
def get_emoji_name(string: str) -> str:
|
def get_emoji_name(string: str) -> str:
|
||||||
if (m := re.search('<:(?P<name>\w+):(?P<id>\d+)>', string)):
|
if (m := re.search('<:(?P<name>\w+):(?P<id>\d+)>', string)):
|
||||||
string = m.group('name')
|
string = m.group('name')
|
||||||
|
|||||||
77
src/main.py
77
src/main.py
@@ -1,76 +1,23 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/local/bin/python
|
||||||
|
|
||||||
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
from datetime import datetime
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from discord import Intents, Message
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from rich.console import Console
|
|
||||||
from rich.highlighter import NullHighlighter
|
|
||||||
from rich.logging import RichHandler
|
|
||||||
|
|
||||||
from kwaylon import Kwaylon
|
from kwaylon import Kwaylon
|
||||||
|
|
||||||
TZ = datetime.now().astimezone().tzinfo
|
|
||||||
|
|
||||||
async def save_pictures(client: Kwaylon, dest: Path):
|
|
||||||
kwargs = dict(
|
|
||||||
limit=10,
|
|
||||||
after=datetime(year=2023, month=1, day=1, tzinfo=TZ),
|
|
||||||
oldest_first=True
|
|
||||||
)
|
|
||||||
async for msg in client.msg_gen(**kwargs):
|
|
||||||
if len(msg.attachments) > 0:
|
|
||||||
for attachment in msg.attachments:
|
|
||||||
if attachment.content_type == 'image/jpeg':
|
|
||||||
filepath = Path(f'/kwaylon/pics/{msg.author.display_name.replace(".", "")}_{msg.created_at.strftime("%Y%m%d_%H%M%S.jpeg")}')
|
|
||||||
if not filepath.exists():
|
|
||||||
logging.debug(f'[bold blue]{msg.author.display_name}[/] {msg.clean_content[:200]}')
|
|
||||||
logging.debug(f'Saving {filepath.name}')
|
|
||||||
await attachment.save(filepath)
|
|
||||||
else:
|
|
||||||
logging.debug(f'Skipping {filepath.name}')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
rich_handler = RichHandler(
|
|
||||||
console=Console(width=150),
|
|
||||||
highlighter=NullHighlighter(),
|
|
||||||
markup=True,
|
|
||||||
rich_tracebacks=True,
|
|
||||||
tracebacks_suppress=['pandas', 'discord'],
|
|
||||||
)
|
|
||||||
dt_fmt = '%Y-%m-%d %I:%M:%S %p'
|
|
||||||
# https://docs.python.org/3/library/logging.html#logrecord-attributes
|
|
||||||
log_format = '[magenta]%(name)s[/] [cyan]%(funcName)s[/] %(message)s'
|
|
||||||
formatter = logging.Formatter(log_format, dt_fmt)
|
|
||||||
|
|
||||||
logging.basicConfig(
|
|
||||||
level=logging.DEBUG,
|
|
||||||
format=log_format,
|
|
||||||
datefmt=dt_fmt,
|
|
||||||
handlers=[rich_handler]
|
|
||||||
)
|
|
||||||
|
|
||||||
intents = Intents.default()
|
|
||||||
intents.message_content = True
|
|
||||||
client = Kwaylon(intents=intents)
|
|
||||||
|
|
||||||
@client.event
|
|
||||||
async def on_ready():
|
|
||||||
await client.initialize()
|
|
||||||
# https://discordpy.readthedocs.io/en/stable/api.html#discord.TextChannel.history
|
|
||||||
# await save_pictures(client, Path('/kwaylon/pics'))
|
|
||||||
|
|
||||||
@client.event
|
|
||||||
async def on_message(message: Message):
|
|
||||||
await client.handle_message(message)
|
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
client.run(
|
loop = asyncio.new_event_loop()
|
||||||
os.getenv('DISCORD_TOKEN'),
|
loop.create_task(
|
||||||
log_handler=rich_handler,
|
Kwaylon.create_and_start(
|
||||||
log_formatter=formatter,
|
os.getenv('DISCORD_TOKEN'),
|
||||||
log_level=logging.INFO,
|
logging.DEBUG
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
try:
|
||||||
|
loop.run_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user