Commit Graph
42 Commits
Author SHA1 Message Date
HornwitserandRapptz ed76151c70 Warn on high latency and blocking heartbeat
Add warnings for when the heartbeat is blocked for a long time and when
the websocket latency is excessively high.  These indicate problems with
blocking the event loop and/or insufficient computing resources to keep
up with the demand.
2019-01-28 22:22:53 -05:00
HornwitserandRapptz 1f4940d171 Fix README.rst for PyPi
Add long_description_content_type in setup.py, fix incorrectly
matched up title underlines in README.rst, and fix incorrect entry in
MANIFEST.in that was forgotten when the README was renamed in 06296bf.
2019-01-28 22:22:53 -05:00
HornwitserandRapptz 883ae8fe80 Fix accidental regression of 9bc48b2 in fa46b07
Occured due to difficult to spot difference in git merge when rebasing
the lint changes.
2019-01-28 22:22:51 -05:00
HornwitserandRapptz 7fe4c999fb Actually drop copy.copy in Member
Remove the old and slow Member._copy implementation that was left over
by accident in 095f0ec.  Since it was defined later it overrode the new
implementation and rendered it moot.
2018-11-24 22:38:49 -05:00
HornwitserandRapptz 1c3a5831f9 [lint] Removed unused variable handler
Left over by the removal of handlers in 2721689.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz 0e7b378151 [lint] Remove extra whitespace in guild.py
Remove trailing whitespace in guild.py introduced by 3727ea9.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz df144b0959 [lint] Changed missed docstrings to raw-string
Missed by a4d1599 despite being pointed out in #1570.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz efb4ff850e [lint] Fix import order
Reorder imports to be consistenly grouped by standard library, third
party library, and local modules in that order thoughout the library.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz ed6451b9da [commands] Remove duplicated quote entries
Remove two duplicated entries from the quote mapping in commands.view.
These were introduced at the creation of this mapping in ea061ef.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz 34fd266cf9 [lint] Do log formating lazily
Convert log("fmt" % args) to log("fmt", args) as the latter is lazy and
does not do the formating if the string is never logged.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz a0634b3eea [lint] Simplyfy util.valid_icon_size
Remove redundant paranthesis and checks from util.valid_icon_size.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz 51d626eabe [lint] Remove redundant paranthesis
Remove redundant parenthisis around await expressions.  Left over from
f25091ef.
2018-11-24 22:17:58 -05:00
HornwitserandRapptz 633192b3cd [lint] Replace equality comparisons to singletons
Restrict the values accepted by comparisons with booleans to be actual
booleans.

Minor breaking of undocumented behaviour in permissions; the value to
set bits to must be booleans (as indicated by the type error thrown).
2018-11-24 22:17:57 -05:00
HornwitserandRapptz fa46b07db1 [lint] Rename exception variables to exc
Use the more explicit (and common) exc instead of e as the variable
holding the exception in except handlers.
2018-11-24 22:17:57 -05:00
HornwitserandRapptz 4ae8e81660 [lint] Remove redundant exception variables
Use bare raise statement when reraising the exception that occured, and
remove unused exception variables.  Also remove a pointless exception
handler in discord.opus.
2018-11-24 22:17:57 -05:00
HornwitserandRapptz a71b3b5fa0 [lint] Limit unneccessarily broad except clauses
Add exception qualifier(s) to bare except clauses swallowing exceptions.
2018-11-24 22:17:57 -05:00
HornwitserandRapptz cd218fa6a7 Remove Reaction.users "Python 3.4 usage" section
Remove nonsensical "Python 3.4" usage section from Reaction.users().
Left behind from f25091ef.
2018-08-28 23:50:52 -04:00
HornwitserandRapptz c557ee33ca [lint] Fix types used for __slots__ and __all__
Stay consistent with the rest of the library and use lists for module
__all__ values and tuples for class __slots__ attributes.
2018-08-22 21:43:55 -04:00
HornwitserandRapptz d20772c680 [lint] Replace deprecated Logger function warn
The method log of Logger has never been documented as being a part of
the standard logging module.  It was renamed to warning when the module
was included in the standard library, but the old name was kept for
backward compatibility.
2018-08-22 21:43:54 -04:00
HornwitserandRapptz c8b49d37be [lint] Fix incorrect and inconsistent whitespace
Adjust whitespace to be consistent with the rest of the library.
2018-08-22 21:43:53 -04:00
HornwitserandRapptz 3679819c53 [lint] Remove unnecessary lambdas
Lambdas of the form `lambda x: func(x)` are redundant.
2018-08-22 21:43:52 -04:00
HornwitserandRapptz 119c5a0618 [lint] Remove unused variables
Left over from various refactoring and rewrites.
2018-08-22 21:43:51 -04:00
HornwitserandRapptz d58fc0ccee [lint] Remove unused imports
Left over from various refactoring and rewrites.
2018-08-22 21:43:50 -04:00
HornwitserandRapptz a93c3d931c [commands] Change command_prefix behaviour
Change the behaviour of handling iterable command_prefix types to not
silently ignore falsy prefixes and unify behaviour for all iterable
types.  Add special handling of a possible TypeError in both get_prefix
and get_context for when the prefix is a different type from what is
expected.
2018-06-29 21:48:30 -04:00
HornwitserandRapptz 96baabcaa2 Fix typo in Permissions.is_subset/is_superset
Fix the name for the other's type when raising TypeError being
incorrectly written as __class__name instead of __class__.__name__ in
the is_subset and is_superset methods of the Permissions class.  This
was introduced at the creation of these methods in 21c88cf.
2018-06-21 07:44:00 -04:00
HornwitserandRapptz e1f8bdc440 Make PyNaCl optional 2016-06-28 00:58:11 -04:00
Hornwitser e516c24746 Fix exception when handling login failure
Logging in with an invalid token would throw a TypeError due to improper
passing of arguments to HTTPClient._token.  Fix by properly passing the
keyword only bot argument.
2016-06-14 18:52:48 +02:00
Hornwitser 320cd39b6a Print to stderr in on_error
Apparently the clever hack for logging in on_error was not so clever
after all.  If logging isn't configured, by the logging modules
definition of not configured, which is root logger not having an
Handlers attached, it will call logging.basicConfig().  Which messes up
setups that define handlers for other loggers than the root logger.

Going directly to the root logger rather than using the broken
convenience methods for logger is not an option either, as logger before
Python 3.2 does not have lastResort on the root logger, and prints an
error when invoked without any handlers.

Resolve by printing tracebacks to stderr by default in on_error.
2015-10-22 22:07:50 +02:00
Hornwitser 9ab1d041d4 Log to root logger by default in on_error
Change the default implementation of on_error to log to the root logger
instead of discord.client and clarify that the exception is being
ignored.  This ensures that a message will be output to standard error
in case the logging module has not been configured.

Also removes the argument printing for the default on_error, this is due
to them often being too long, that they could cause another exception to
be thrown, and because it sometimes causes sensitive information to be
output such as Discord tokens and session ids.  It was also possible for
the length to get in the megabyte range with exceptions thrown by
on_socket_raw_receive in READY events.
2015-10-21 01:03:25 +02:00
HornwitserandRapptz 023e0eb1d5 Use compact encoding for json on websocket
Remove extra whitespace from json encoding used when sending messages on
the websocket.
2015-10-16 16:20:04 -04:00
HornwitserandRapptz 07adb330db Add events for sniffing the WebSocket data
Add on_socket_raw_receive and on_socket_raw_send events for sniffing the
data being received and sent on the websocket. Useful for debugging and
logging websocket messages received and sent on the link to Discord's
servers.
2015-10-16 16:20:04 -04:00
Hornwitser e258c9b893 Clarify logging and on_error documentation
Change the description of on_error to reflect that exceptions are logged
and not output by default. Add a note about not configuring logging
causing exceptions to be silently ignored in handlers in the API. And
add some more explanations and a simpler configuration example to the
logging description.
2015-10-06 19:09:16 +02:00
Hornwitser ea2f35fb24 Set up logging module in examples
Without setting up the logging module, a god number of error conditions
and warnings will never be output by the library.  This is a common
pitfall to forget and it's not documented good enough the consequences
of not setting up the logging module when developing applications with
this library.
2015-10-06 19:09:16 +02:00
Hornwitser a98324fbf8 Add handling of login failure in examples
Check and handle login failure in the examples provided for using this
library.  This is a common error condition that should be handled by any
script using this library.
2015-10-06 19:09:16 +02:00
Hornwitser 68c3fde089 Make event based handlers first class
Change Client.event decorator to assign the event handler function to
the instance it self and levarage dispatch to handle calling these
event.  Remove old _invoke_event method.
2015-10-06 19:09:16 +02:00
Hornwitser 74a06e0b79 Change behaviour of on_error
Change how the old style on_error event is called to match the new style
on_error event.  Both are now called in case an exception is raised in
an user defined event handler, and will by default print the arguments
of the event tha raised the exception and the traceback for the
exception.  In addition, overridding the on_error handler supresses this
behaviour.
2015-10-06 19:09:16 +02:00
Hornwitser d044d7b781 Add client register API
When clicking on an invite link without having a Discord account it's
possible to create an unclaimed account for joining the conversation
quickly.  Add register() method to Client that performs and invite based
registration of an unclaimed account.
2015-10-06 19:09:16 +02:00
Hornwitser 5e952015a6 Reconnect when WebSocket dies
Check if the WebSocket connection was supposed to terminate and
reconnect to the gateway if this is not the case.
2015-10-06 19:09:16 +02:00
Hornwitser 247d1f9ed4 Make dispatch multithreading safe
Guard the execution of dispatch with a recursive thread lock.  This is
needed to make a thread safe way to send events to Client objects.  Note
that the only thread safe method is dispatch, everything else is unsafe
to call from another thread, as the thead handling the Client object
could be modifying arbitrary structures at any time.  In addition this
only keeps nasal demons away, and does not solve any of the difficult
syncronization issues that might be present.
2015-10-06 19:09:16 +02:00
Hornwitser 5e671a0d0d Move socket and connection state out of Client
Move the socket message handling and Discord connection state tracking
out of the Client class.  The WebSocket class handles the ws4py based
WebSocket to Discord, maintains the keepalive and dispatches
socket_<events> based on activity.  The ConnectionSTate class maintains
the state associated with the WebSocket connection with Discord.  In a
reconnect and switch gateway scenario this state can be kept for a
faster and less disruptive recovery.
2015-10-06 19:09:09 +02:00
Hornwitser c47e31c82e Add new event system
Add event system based on a public dispatch method in Client.  The new
event system bases itself on two types of events, internal event
handlers and user defined event handlers.  Internal event handlers begin
with 'handle_', and user defined events begin with 'on_'.  Events are
dispatched with dispatch(event_name, *args).  The Client class should be
subclassed and the on_<event> handlers defined in it for responding to
events.  The handle_<event> handlers can the overridden to override the
behaviour of the Client class, though this is not recommended.

The subclassing method allows separation of the instance of the client
and the code that handles it.  (i.e. you don't need the instance of the
client object to define event handlers for it).  Though, the old method
of using the event decorator from the instance will still be supported.
2015-10-06 17:34:23 +02:00
Hornwitser a4c152cebc Fix keep_alive running after logout()
_keep_alive_handler would set up another keep alive after the first one
by creating a new threading.Timer object, but Client would only keep
track of the first timer object.  Thus casing the keep alive to continue
running after Client.logout calls cancel() on it's timer object, as it
no longer references the actual timer object waiting for the keep alive.

Fix by replacing _keep_alive_handler with a threading.Thread subclass
that sends keep_alives of the given interval and exits when its stop
event is set.
2015-09-19 18:32:39 +02:00