aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeLines
...
| | | | * | | | | | | | | | | Improved type hinting for `format_infraction_with_duration`Gravatar Shirayuki Nekomata2019-12-04-1/+5
| | | | | |/ / / / / / / / / | | | | |/| | | | | | | | |
| | | | | * | | | | | | | | Reddit: raise ClientError when the token can't be retrievedGravatar MarkKoz2019-12-11-4/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Raising an exception allows the error handler to display a message to the user if the failure happened from a command invocation.
| | | | | * | | | | | | | | Reddit: log retries when getting the access tokenGravatar MarkKoz2019-12-11-1/+9
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: create a dict constant for the User-Agent headerGravatar MarkKoz2019-12-11-27/+12
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: revise docstringsGravatar MarkKoz2019-12-11-9/+17
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: define AccessToken type at the module levelGravatar MarkKoz2019-12-11-1/+2
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: use expires_in from the response to calculate token expirationGravatar MarkKoz2019-12-11-2/+3
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: use qualified_name attribute when removing the cogGravatar MarkKoz2019-12-11-1/+1
| | | | | | | | | | | | | |
| | | | | * | | | | | | | | Reddit: move BasicAuth instantiation to __init__Gravatar MarkKoz2019-12-11-4/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The object is basically just a namedtuple so there's no need to re-create it every time a token is obtained. * Remove log message which shows credentials. * Initialise headers attribute to None in __init__.
| | | | | * | | | | | | | | Reddit: move token renewal inside fetch_postsGravatar MarkKoz2019-12-11-17/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This removes the duplicate code for renewing the token. Since fetch_posts is the only place where the token gets used, it can just be refreshed there directly.
| | | | | * | | | | | | | | Merge branch 'master' into reddit-api-oauthGravatar Jens2019-12-05-1198/+3100
| | | | | |\ \ \ \ \ \ \ \ \
| | | | | * | | | | | | | | | Keeps access token alive, only revokes it on extension unload.Gravatar Jens2019-12-05-20/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Hard-coded version number to 1.0.0.
| | | | | * | | | | | | | | | Fix linting errorGravatar Jens2019-10-26-0/+1
| | | | | | | | | | | | | | |
| | | | | * | | | | | | | | | Resolved merge conflicts.Gravatar Jens2019-10-26-1605/+2753
| | | | | |\ \ \ \ \ \ \ \ \ \ | | | | | | | |_|_|/ / / / / / | | | | | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add retry loop to token request. Revoke access token after usage.
| | | | | * | | | | | | | | | Add reddit environment variable, change User-Agent and fix lint problemGravatar Jens2019-10-22-2/+4
| | | | | | | | | | | | | | |
| | | | | * | | | | | | | | | Merge branch 'master' of https://github.com/python-discord/bot into ↵Gravatar Jens2019-10-16-92/+291
| | | | | |\ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | reddit-api-oauth
| | | | | * \ \ \ \ \ \ \ \ \ \ Resolve merge conflictGravatar Jens2019-10-15-4/+2
| | | | | |\ \ \ \ \ \ \ \ \ \ \
| | | | | | * | | | | | | | | | | Add Reddit OAuth tasks and refactor codeGravatar Jens2019-10-09-6/+77
| | | | | | | |_|_|_|_|_|_|_|_|/ | | | | | | |/| | | | | | | | |
| | | | | * | | | | | | | | | | Unload cog on auth error and fix linting warningsGravatar Jens2019-10-15-19/+16
| | | | | | | | | | | | | | | |
| | | | | * | | | | | | | | | | Add Reddit OAuth tasks and refactor codeGravatar Jens2019-10-14-6/+76
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Specify assertion to be a tuple comparisonGravatar kwzrd2019-11-14-1/+1
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Make complex test cases namedtuples, recognize between various authors, pass ↵Gravatar kwzrd2019-11-14-12/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | config to subTest
| | | | | | | | | | * | | | | | Hold recent_messages in a list to respect type hint, set config in setUpGravatar kwzrd2019-11-14-5/+8
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Adjust attachments rule unit test to correcty build the arguments for the ↵Gravatar kwzrd2019-11-14-7/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | tested rule
| | | | | | | | | | * | | | | | Fix bug in attachments rule where last_message could potentially count twice ↵Gravatar kwzrd2019-11-14-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | in the sum of attachments
| | | | | | | | | | * | | | | | Use async_test helper to simplify coro testingGravatar kwzrd2019-11-13-9/+14
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Adjust attachments rule to use MockMessage, restructure test casesGravatar kwzrd2019-11-13-20/+23
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Adjust links rule to use proper MockMessageGravatar kwzrd2019-11-13-14/+10
| | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | Merge branch 'master' into unittest-mentionsGravatar kwzrd2019-11-13-179/+187
| | | | | | | | | | |\ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Testing methodology was adjusted in upstream repo. Merging the relevant changes.
| | | | | | | | | | * | | | | | | Adjust incorrect type hintGravatar kwzrd2019-11-09-1/+1
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Use MockMessage instead of custom FakeMessageGravatar kwzrd2019-11-09-15/+11
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Adjust type hint to correctly represent internal typeGravatar kwzrd2019-11-09-1/+1
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Use range to build mock mentions listGravatar kwzrd2019-11-09-1/+1
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Adjust docstring asterisk to backtick for consistencyGravatar kwzrd2019-11-09-1/+1
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Add missing docstringGravatar kwzrd2019-11-09-0/+1
| | | | | | | | | | | | | | | | |
| | | | | | | | | | * | | | | | | Add unit test for mentions antispam ruleGravatar kwzrd2019-11-09-0/+98
| | | | | | | | | | | | | | | | |
| | | | | | | | | | | | * | | | | Whitelist Discord Testers invite linkGravatar Matteo Bertucci2019-12-10-0/+1
| | | | |_|_|_|_|_|_|_|/ / / / / | | | |/| | | | | | | | | | | |
| | | | | | | | | | | | | * | | Make it easier for user to search for tagsGravatar Shirayuki Nekomata2019-10-18-9/+61
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #### Closes #231 Applying the algorithm for `Needles and Haystack` to find and match tag in tags, for example: ![Example](https://cdn.discordapp.com/attachments/634243438459486219/634592981915140107/unknown.png) This only applies to searching tag_name with more than 3 in length, and at least 80% of its letters are found, from left to right. There are 3 levels of checking, stop at first found: - Check if exact name ( case insensitive ) O(1) getting from a dictionary Dict[str, Tag] - Check for all tags that has 100% matching via algorithm - Check for all tags that has >= 80% matching If there are more than one hit, it will be shown as suggestions: ![Suggestions](https://cdn.discordapp.com/attachments/634243438459486219/634595369531211778/unknown.png) In order to avoid api being called multiple times, I've implemented a cache to only refresh itself when the is a gap of more than 5 minutes from the last api call to get all tags. Editing / Adding / Deleting tags will also modify the cache directly. ##### What about other solution like fuzzywuzzy? fuzzywuzzy was considered for using, but from testing, it was giving much lower scores than expected: Code used to test: ```py from fuzzywuzzy import fuzz def _fuzzy_search(search: str, target: str) -> bool: found = 0 index = 0 _search = search.lower().replace(' ', '') _target = target.lower().replace(' ', '') for letter in _search: index = _target.find(letter, index) if index == -1: break found += index > 0 # return found / len(_search) * 100 return ( found / len(_search) * 100, fuzz.ratio(search, target), fuzz.partial_ratio(search, target) ) tests = ( 'this-is-gonna-be-fun', 'this-too-will-be-fun' ) for test in tests: print(test, '->', _fuzzy_search('this too fun', test)) ``` Result from test: ```py this-is-gonna-be-fun -> (30.0, 50, 50) this-too-will-be-fun -> (90.0, 62, 58) ```
| | | | | | | | | | | | | | * | Fix linting errorGravatar kosayoda2019-10-28-2/+2
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | * | Apply suggestions from code review Gravatar Kieran Siek2019-10-28-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix incorrect docstring and comment Co-Authored-By: Mark <[email protected]>
| | | | | | | | | | | | | | * | Add delete emoji to paginationGravatar kosayoda2019-10-28-10/+21
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | * | Revert "Remove dev-test limit for filtering debugging"Gravatar kosayoda2019-10-28-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 56696b3b1858ad27dc7f3dce2898c7a6eb151f43.
| | | | | | | | | | | | | | * | Remove dev-test limit for filtering debuggingGravatar kosayoda2019-10-27-2/+2
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | * | Differentiate clear and delete emoji in help cogGravatar kosayoda2019-10-27-10/+13
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | * | Use trashcan emoji for message deletionGravatar kosayoda2019-10-27-1/+9
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | * Merge remote-tracking branch 'origin/master' into zen-commandGravatar MarkKoz2019-12-12-1209/+3144
| | | | | | | | | | | | | | | |\ | |_|_|_|_|_|_|_|_|_|_|_|_|_|_|/ |/| | | | | | | | | | | | | | |
* | | | | | | | | | | | | | | | Subclass Bot (#681)Gravatar scragly2019-12-12-185/+225
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Subclass Bot
| * | | | | | | | | | | | | | | | Use the AsyncResolver for APIClient and discord.py sessions tooGravatar MarkKoz2019-12-08-11/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Active thread counts are observed to be lower with it in use.
| * | | | | | | | | | | | | | | | Fix test failures for setup log messagesGravatar MarkKoz2019-12-08-24/+7
| | | | | | | | | | | | | | | | |
| * | | | | | | | | | | | | | | | Properly create and close aiohttp sessionsGravatar MarkKoz2019-12-08-10/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | aiohttp throws a warning when a session is created outside of a running async event loop. In aiohttp 4.0 this actually changes to an error instead of merely a warning. Since discord.py manages the event loop with client.run(), some of the "internal" coroutines of the client were overwritten in the bot subclass to be able to hook into when the bot starts and stops. Sessions of both the bot and the API client can now potentially be None if accessed before the sessions have been created. However, if called, the API client's methods will wait for a session to be ready. It will attempt to create a session as soon as the event loop starts (i.e. the bot is running).