Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions pepubot/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@
import asyncio
import logging
import sys
from typing import Any, Mapping, Sequence

import slack
from typing import Any, Sequence

from . import slack
from .runner import PePuRunner
from .settings import initialize_settings
from .slack import get_rtm_client

LOG = logging.getLogger(__name__)

Expand All @@ -30,24 +28,19 @@ def parse_args(argv: Sequence[str]) -> Any:

def run_pepubot() -> None:
LOG.info('Initializing the Slack RTM client')
slack_rtm_client = get_rtm_client()
slack_rtm_client = slack.get_rtm_client()

LOG.info('Creating PePuRunner with a Slack Web client')
slack_web_client = slack.get_web_client()
pepu_runner = PePuRunner(slack_web_client)

LOG.info('Binging our event handler')
slack_rtm_client.on(event='message', callback=handle_new_message)
slack_rtm_client.on(event='message', callback=pepu_runner.feed_message)

LOG.info('Starting the Slack RTM session in an event loop')
loop = asyncio.get_event_loop()
loop.run_until_complete(slack_rtm_client.start())


async def handle_new_message(
*,
data: Mapping[str, Any],
web_client: slack.WebClient,
**kwargs: object,
) -> None:
await PePuRunner(web_client).feed_message(data)


if __name__ == '__main__':
main()
14 changes: 12 additions & 2 deletions pepubot/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,18 @@ class PePuState(Enum):
class PePuRunner:
def __init__(self, slack_client: slack.WebClient) -> None:
self.slack = slack_client
self._state_loaded: bool = False
self.state: PePuState = PePuState.not_started
self.start_message: Optional[MessageInfo] = None
self.round_participants: List[str] = []
self._lock = asyncio.Lock()

async def feed_message(self, event_data: Mapping[str, Any]) -> None:
message = Message.from_message_event(event_data)
async def feed_message(
self,
data: Mapping[str, Any],
**kwargs: object,
) -> None:
message = Message.from_message_event(data)
if not message:
return

Expand Down Expand Up @@ -266,6 +271,9 @@ async def dump_lottery_box(self, message: Message) -> None:
channel=message.channel, text=text)

async def _load(self) -> None:
if self._state_loaded:
return

storage = get_default_storage()

async with self._lock:
Expand All @@ -281,6 +289,8 @@ async def _load(self) -> None:

self.round_participants = (participants or '').splitlines()

self._state_loaded = True

async def _save(self) -> None:
storage = get_default_storage()
await storage.store_item('runner_state', self.state.value)
Expand Down