feat: Add simple koans module.

This commit is contained in:
2025-07-24 04:49:48 +10:00
parent 9c0ae404c8
commit e3bdebe221
5 changed files with 140 additions and 17 deletions

View File

@@ -7,6 +7,8 @@ from meta import CrocBot, conf, setup_main_logger, args
from data import Database from data import Database
from constants import DATA_VERSION from constants import DATA_VERSION
from modules import setup
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -30,10 +32,9 @@ async def main():
config=conf, config=conf,
dbconn=db, dbconn=db,
adapter=adapter, adapter=adapter,
setup=setup,
) )
# await bot.load_module('modules')
try: try:
await bot.start() await bot.start()
finally: finally:

View File

@@ -15,7 +15,7 @@ logger = logging.getLogger(__name__)
class CrocBot(commands.Bot): class CrocBot(commands.Bot):
def __init__(self, *args, config: Conf, dbconn: Database, **kwargs): def __init__(self, *args, config: Conf, dbconn: Database, setup=None, **kwargs):
kwargs.setdefault('client_id', config.bot['client_id']) kwargs.setdefault('client_id', config.bot['client_id'])
kwargs.setdefault('client_secret', config.bot['client_secret']) kwargs.setdefault('client_secret', config.bot['client_secret'])
kwargs.setdefault('bot_id', config.bot['bot_id']) kwargs.setdefault('bot_id', config.bot['bot_id'])
@@ -26,6 +26,7 @@ class CrocBot(commands.Bot):
self.config = config self.config = config
self.dbconn = dbconn self.dbconn = dbconn
self.data: BotData = dbconn.load_registry(BotData()) self.data: BotData = dbconn.load_registry(BotData())
self._setup_hook = setup
self.joined: dict[str, BotChannel] = {} self.joined: dict[str, BotChannel] = {}
@@ -63,6 +64,9 @@ class CrocBot(commands.Bot):
url = self.get_auth_url(scopes) url = self.get_auth_url(scopes)
logger.info("User account authorisation url: %s", url) logger.info("User account authorisation url: %s", url)
if self._setup_hook is not None:
await self._setup_hook(self)
logger.info("Finished setup") logger.info("Finished setup")
def get_auth_url(self, scopes: Optional[Scopes] = None): def get_auth_url(self, scopes: Optional[Scopes] = None):

View File

@@ -1,15 +1,3 @@
this_package = 'modules'
active = [
'.vstudio',
]
def prepare(bot):
for ext in active:
bot.load_module(this_package + ext)
async def setup(bot): async def setup(bot):
for ext in active: from . import koans
await bot.load_module(this_package + ext) await koans.setup(bot)

View File

@@ -0,0 +1,7 @@
import logging
logger = logging.getLogger(__name__)
async def setup(bot):
from .component import KoanComponent
await bot.add_component(KoanComponent(bot))

View File

@@ -0,0 +1,123 @@
from typing import Optional
import random
import twitchio
from twitchio.ext import commands as cmds
from datamodels import Koan, Communities
from . import logger
class KoanComponent(cmds.Component):
def __init__(self, bot):
self.bot = bot
@cmds.Component.listener()
async def event_message(self, payload: twitchio.ChatMessage) -> None:
print(f"[{payload.broadcaster.name}] - {payload.chatter.name}: {payload.text}")
@cmds.group(invoke_fallback=True)
async def koans(self, ctx: cmds.Context) -> None:
"""
List the (names of the) koans in this channel.
!koans
"""
community = await Communities.fetch_or_create(twitchid=ctx.channel.id, name=ctx.channel.name)
cid = community.communityid
koans = await Koan.fetch_where(communityid=cid)
if koans:
names = ', '.join(koan.name for koan in koans)
await ctx.reply(
f"Koans: {names}"
)
else:
await ctx.reply("No koans have been made in this channel!")
@koans.command(name='add', aliases=['new', 'create'])
async def koans_add(self, ctx: cmds.Context, name: str, *, text: str):
"""
Add or overwrite a koan to this channel.
!koans add wind This is a wind koan
"""
community = await Communities.fetch_or_create(twitchid=ctx.channel.id, name=ctx.channel.name)
cid = community.communityid
name = name.lower()
assert isinstance(ctx.author, twitchio.Chatter)
if (ctx.author.moderator or ctx.author.broadcaster):
# Delete the koan with this name if it exists
existing = await Koan.table.delete_where(
communityid=cid,
name=name,
)
# Insert the new koan
await Koan.create(
communityid=cid,
name=name,
message=text
)
# Ack
if existing:
await ctx.reply(f"Updated the koan '{name}'")
else:
await ctx.reply(f"Created the new koan '{name}'")
@koans.command(name='del', aliases=['delete', 'rm', 'remove'])
async def koans_del(self, ctx: cmds.Context, name: str):
"""
Remove a koan from this channel by name.
!koans del wind
"""
community = await Communities.fetch_or_create(twitchid=ctx.channel.id, name=ctx.channel.name)
cid = community.communityid
name = name.lower()
assert isinstance(ctx.author, twitchio.Chatter)
if (ctx.author.moderator or ctx.author.broadcaster):
# Delete the koan with this name if it exists
existing = await Koan.table.delete_where(
communityid=cid,
name=name,
)
if existing:
await ctx.reply(f"Deleted the koan '{name}'")
else:
await ctx.reply(f"The koan '{name}' does not exist to delete!")
@cmds.command(name='koan')
async def koan(self, ctx: cmds.Context, name: Optional[str] = None):
"""
Show a koan from this channel. Optionally by name.
!koan
!koan wind
"""
community = await Communities.fetch_or_create(twitchid=ctx.channel.id, name=ctx.channel.name)
cid = community.communityid
if name is not None:
name = name.lower()
koans = await Koan.fetch_where(
communityid=cid,
name=name
)
if koans:
koan = koans[0]
await ctx.reply(koan.message)
else:
await ctx.reply(f"The requested koan '{name}' does not exist! Use '{ctx.prefix}koans' to see all the koans.")
else:
koans = await Koan.fetch_where(communityid=cid)
if koans:
koan = random.choice(koans)
await ctx.reply(koan.message)
else:
await ctx.reply("This channel doesn't have any koans!")