rewrite: New Scheduled Session System.

This commit is contained in:
2023-06-30 11:15:39 +03:00
parent b7d66ffe8c
commit a7c5af59a7
31 changed files with 4588 additions and 44 deletions

View File

@@ -0,0 +1,156 @@
from data import Registry, RowModel, Table
from data.columns import Integer, Timestamp, String, Bool
from utils.data import MULTIVALUE_IN
class ScheduleData(Registry):
class ScheduleSlot(RowModel):
"""
Schema
------
"""
_tablename_ = 'schedule_slots'
slotid = Integer(primary=True)
created_at = Timestamp()
@classmethod
async def fetch_multiple(cls, *slotids, create=True):
"""
Fetch multiple rows, applying cache where possible.
"""
results = {}
to_fetch = set()
for slotid in slotids:
row = cls._cache_.get(slotid, None)
if row is None:
to_fetch.add(slotid)
else:
results[slotid] = row
if to_fetch:
rows = await cls.fetch_where(slotid=list(to_fetch))
for row in rows:
results[row.slotid] = row
to_fetch.remove(row.slotid)
if to_fetch and create:
rows = await cls.table.insert_many(
('slotid',),
*((slotid,) for slotid in to_fetch)
).with_adapter(cls._make_rows)
for row in rows:
results[row.slotid] = row
return results
class ScheduleSessionMember(RowModel):
"""
Schema
------
"""
_tablename_ = 'schedule_session_members'
guildid = Integer(primary=True)
userid = Integer(primary=True)
slotid = Integer(primary=True)
booked_at = Timestamp()
attended = Bool()
clock = Integer()
book_transactionid = Integer()
reward_transactionid = Integer()
class ScheduleSession(RowModel):
"""
Schema
------
"""
_tablename_ = 'schedule_sessions'
guildid = Integer(primary=True)
slotid = Integer(primary=True)
opened_at = Timestamp()
closed_at = Timestamp()
messageid = Integer()
created_at = Timestamp()
@classmethod
async def fetch_multiple(cls, *keys, create=True):
"""
Fetch multiple rows, applying cache where possible.
"""
# TODO: Factor this into a general multikey fetch many
results = {}
to_fetch = set()
for key in keys:
row = cls._cache_.get(key, None)
if row is None:
to_fetch.add(key)
else:
results[key] = row
if to_fetch:
condition = MULTIVALUE_IN(cls._key_, *to_fetch)
rows = await cls.fetch_where(condition)
for row in rows:
results[row._rowid_] = row
to_fetch.remove(row._rowid_)
if to_fetch and create:
rows = await cls.table.insert_many(
cls._key_,
*to_fetch
).with_adapter(cls._make_rows)
for row in rows:
results[row._rowid_] = row
return results
class ScheduleGuild(RowModel):
"""
Schema
------
"""
_tablename_ = 'schedule_guild_config'
_cache_ = {}
guildid = Integer(primary=True)
schedule_cost = Integer()
reward = Integer()
bonus_reward = Integer()
min_attendance = Integer()
lobby_channel = Integer()
room_channel = Integer()
blacklist_after = Integer()
blacklist_role = Integer()
@classmethod
async def fetch_multiple(cls, *guildids, create=True):
"""
Fetch multiple rows, applying cache where possible.
"""
results = {}
to_fetch = set()
for guildid in guildids:
row = cls._cache_.get(guildid, None)
if row is None:
to_fetch.add(guildid)
else:
results[guildid] = row
if to_fetch:
rows = await cls.fetch_where(guildid=list(to_fetch))
for row in rows:
results[row.guildid] = row
to_fetch.remove(row.guildid)
if to_fetch and create:
rows = await cls.table.insert_many(
('guildid',),
*((guildid,) for guildid in to_fetch)
).with_adapter(cls._make_rows)
for row in rows:
results[row.guildid] = row
return results
"""
Schema
------
"""
schedule_channels = Table('schedule_channels')