49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
|
import asyncio
|
||
|
|
||
|
|
||
|
class FollowingResult:
|
||
|
def __init__(self, event, kind, payload):
|
||
|
self.event = event
|
||
|
self.kind = kind
|
||
|
self.payload = payload
|
||
|
|
||
|
|
||
|
class Following:
|
||
|
queue = asyncio.Queue()
|
||
|
|
||
|
def __init__(self, kind, uid):
|
||
|
self.kind = kind # author topic shout chat
|
||
|
self.uid = uid
|
||
|
|
||
|
|
||
|
class FollowingManager:
|
||
|
lock = asyncio.Lock()
|
||
|
data = {
|
||
|
'author': [],
|
||
|
'topic': [],
|
||
|
'shout': [],
|
||
|
'chat': []
|
||
|
}
|
||
|
|
||
|
@staticmethod
|
||
|
async def register(kind, uid):
|
||
|
async with FollowingManager.lock:
|
||
|
FollowingManager[kind].append(uid)
|
||
|
|
||
|
@staticmethod
|
||
|
async def remove(kind, uid):
|
||
|
async with FollowingManager.lock:
|
||
|
FollowingManager[kind].remove(uid)
|
||
|
|
||
|
@staticmethod
|
||
|
async def push(kind, payload):
|
||
|
async with FollowingManager.lock:
|
||
|
if kind == 'chat':
|
||
|
for chat in FollowingManager['chat']:
|
||
|
if payload.message["chatId"] == chat.uid:
|
||
|
chat.queue.put_nowait(payload)
|
||
|
else:
|
||
|
for entity in FollowingManager[kind]:
|
||
|
if payload.shout['createdBy'] == entity.uid:
|
||
|
entity.queue.put_nowait(payload)
|