diff options
| author | 2020-01-17 11:11:04 -0800 | |
|---|---|---|
| committer | 2020-02-12 10:07:53 -0800 | |
| commit | 81716ef72632844e0cf2f33982bbe71cf4b29d7a (patch) | |
| tree | b83d92d06a5fee7288bf8f163ee25c93105c6132 | |
| parent | Sync tests: test sync sends a confirmation prompt (diff) | |
Sync: create a separate function to get the confirmation result
| -rw-r--r-- | bot/cogs/sync/syncers.py | 41 | 
1 files changed, 32 insertions, 9 deletions
| diff --git a/bot/cogs/sync/syncers.py b/bot/cogs/sync/syncers.py index 6c95b58ad..e6faca661 100644 --- a/bot/cogs/sync/syncers.py +++ b/bot/cogs/sync/syncers.py @@ -150,6 +150,34 @@ class Syncer(abc.ABC):          """Perform the API calls for synchronisation."""          raise NotImplementedError +    async def _get_confirmation_result( +        self, +        diff_size: int, +        author: Member, +        message: t.Optional[Message] = None +    ) -> t.Tuple[bool, t.Optional[Message]]: +        """ +        Prompt for confirmation and return a tuple of the result and the prompt message. + +        `diff_size` is the size of the diff of the sync. If it is greater than `MAX_DIFF`, the +        prompt will be sent. The `author` is the invoked of the sync and the `message` is an extant +        message to edit to display the prompt. + +        If confirmed or no confirmation was needed, the result is True. The returned message will +        either be the given `message` or a new one which was created when sending the prompt. +        """ +        log.trace(f"Determining if confirmation prompt should be sent for {self.name} syncer.") +        if diff_size > self.MAX_DIFF: +            message = await self._send_prompt(message) +            if not message: +                return False, None  # Couldn't get channel. + +            confirmed = await self._wait_for_confirmation(author, message) +            if not confirmed: +                return False, message  # Sync aborted. + +        return True, message +      async def sync(self, guild: Guild, ctx: t.Optional[Context] = None) -> None:          """          Synchronise the database with the cache of `guild`. @@ -168,16 +196,11 @@ class Syncer(abc.ABC):          diff = await self._get_diff(guild)          totals = {k: len(v) for k, v in diff._asdict().items() if v is not None} +        diff_size = sum(totals.values()) -        log.trace(f"Determining if confirmation prompt should be sent for {self.name} syncer.") -        if sum(totals.values()) > self.MAX_DIFF: -            message = await self._send_prompt(message) -            if not message: -                return  # Couldn't get channel. - -            confirmed = await self._wait_for_confirmation(author, message) -            if not confirmed: -                return  # Sync aborted. +        confirmed, message = await self._get_confirmation_result(diff_size, author, message) +        if not confirmed: +            return          # Preserve the core-dev role mention in the message edits so users aren't confused about          # where notifications came from. | 
