rewrite: New Scheduled Session System.
This commit is contained in:
156
src/modules/schedule/data.py
Normal file
156
src/modules/schedule/data.py
Normal 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')
|
||||
Reference in New Issue
Block a user