jesopo
d093027431
not all HTTP responses have content-type
2019-08-02 17:33:16 +01:00
jesopo
dd8b276b35
pull priority
out of kwargs
in _hook
2019-07-30 15:24:13 +01:00
jesopo
27a6078f20
Revert "hook priority position should default to 0, not end"
...
This reverts commit ff0cc59507
.
2019-07-30 15:23:13 +01:00
jesopo
5ffe2941e8
Revert "we should be checking if the new hook has a higher priority"
...
This reverts commit b145e664e1
.
2019-07-30 15:23:05 +01:00
jesopo
b145e664e1
we should be checking if the new hook has a higher priority
2019-07-30 15:12:29 +01:00
jesopo
ff0cc59507
hook priority position should default to 0, not end
2019-07-30 15:09:34 +01:00
jesopo
793fc94ea3
source
should have ':' appended
2019-07-28 20:55:54 +01:00
jesopo
ad8f66c00e
Remove debug print
2019-07-28 18:14:44 +01:00
jesopo
163e979f95
move socket creation to it's own function, send event just prior to .connect
2019-07-28 18:07:23 +01:00
jesopo
9827feeabd
'name' -> 'key' (copypaste fail)
2019-07-28 18:07:01 +01:00
jesopo
25b507e80c
Refactor hook kwargs to be stored as a list of tuples to support key duplicates
...
closes #108
2019-07-28 12:35:04 +01:00
jesopo
77dfc76591
switch to function/module magic being a single object
2019-07-26 11:58:06 +01:00
jesopo
b6844303cb
add set_throttle(lines, seconds) function to tweak throttle per-server
2019-07-23 17:46:22 +01:00
jesopo
4babce5357
Only fill throttle when buffer is empty
2019-07-22 13:14:07 +01:00
jesopo
304fcdaebb
gotta str()-ify kwargs
before logging it
2019-07-15 14:27:55 +01:00
jesopo
4815c1612c
don't silently truncate at newline in IRCLine.ParsedLine.truncate()
2019-07-15 14:26:45 +01:00
Mikaela Suomalainen
2f18414cb7
src/EventManager.py: fix typo defualt -> default
2019-07-13 13:04:37 +03:00
jesopo
89c12e845a
add --remove-server/-R cli arg
2019-07-12 09:30:22 +01:00
jesopo
ab45c65fb4
'self.channels' -> 'self._channels'
2019-07-11 14:22:33 +01:00
jesopo
02838e4802
Return new Timers
2019-07-09 11:16:34 +01:00
jesopo
32fa999c78
Allow Timer objects to be cancelled
2019-07-09 11:14:05 +01:00
jesopo
c19c6c0e14
asyncio.gather -> asyncio.wait (with timeout)
2019-07-08 14:50:11 +01:00
jesopo
469c725675
tell asyncio.gather which loop to use
2019-07-08 14:41:12 +01:00
jesopo
a1438abf66
close event loop when we're done with it (request_many())
2019-07-08 13:59:48 +01:00
jesopo
81c7af8ab5
Don't try/except async http exceptions
2019-07-08 13:51:02 +01:00
jesopo
ee0ec0eca1
switch request_many() to use asyncio.gather
2019-07-08 13:46:27 +01:00
jesopo
b62ba469d7
catch async exceptions in utils.http.request_many()
2019-07-08 13:18:59 +01:00
jesopo
078681eddf
add missing schema in utils.http.sanitise_url, use in rss.py
2019-07-08 12:54:06 +01:00
jesopo
ecb8364d0d
switch to using asyncio's event loop
2019-07-08 12:45:10 +01:00
jesopo
15e143fcff
implement utils.http.request_many as a tonado ioloop yield
2019-07-08 11:43:09 +01:00
jesopo
f9d5271762
"paramatered" -> "parametered"
2019-07-04 17:23:36 +01:00
jesopo
43c8ad0ff6
Add !editserver command
2019-07-04 13:15:51 +01:00
jesopo
3afbe5fd82
threading.Lock() around any access to _write_buffer
2019-07-04 06:56:05 +01:00
jesopo
76ab7935a0
return parsed modes from IRCChannel.parse_modes, pass through mode events
2019-07-03 08:13:28 +01:00
jesopo
637067c62c
url_validate() -> url_sanitise()
2019-07-02 14:15:49 +01:00
jesopo
534854127b
Add utils.http.url_validate() for best-effort url tidying
2019-07-02 14:10:18 +01:00
jan6
b6e9713a14
fixed capabilities
2019-07-01 14:41:47 +03:00
jesopo
19f716ab4c
Implemnt _options_factory for OptionsSetting to have dynamic options
2019-06-29 22:26:28 +01:00
jesopo
b4c762eb4e
Automatically format example
text for OptionsSetting (showing options)
2019-06-29 21:33:26 +01:00
jesopo
7091860e54
Setting.__init__ call in OptionsSetting ctor needs self
param
2019-06-28 23:27:56 +01:00
jesopo
756396d758
Implement utils.OptionsSetting
2019-06-28 23:26:42 +01:00
jesopo
ae9d099a41
Refactor set/channelset/serverset/botset in to 'utils.Setting' objects
2019-06-28 23:16:05 +01:00
jesopo
f9eb017466
message arg for HTTPWrongContentTypeException/HTTPParsingException
2019-06-28 23:01:21 +01:00
jesopo
97810db8df
Give descriptions to utils.http.HTTPException subclasses
2019-06-27 18:28:08 +01:00
jesopo
3c3f0449b6
add CaseInsensitiveDict.__contains__
2019-06-26 17:57:49 +01:00
jesopo
16d331dd43
add allow_redirects
kwarg to utils.http.request()
2019-06-26 17:53:16 +01:00
jesopo
c5785a2d14
implement @utils.kwarg() magic, use it for command.regex hooks
2019-06-26 14:37:41 +01:00
jesopo
7060a0ac67
Update IRCBot except queue.Empty
comment
2019-06-26 13:43:00 +01:00
jesopo
4bf5c4783b
Re-add EventManager check to prevent _call() outside main thread
2019-06-26 11:42:23 +01:00
jesopo
bb749b111f
Refactor EventManager to only hold hooks on a root object
2019-06-26 11:01:09 +01:00
jesopo
12181bfec6
Add system to have multiple url shorteners and chose which to use
2019-06-25 17:53:00 +01:00
jesopo
a1cc2e778c
Return 0 seconds if timeout seconds is negative
2019-06-24 17:22:08 +01:00
jesopo
ef0b3ec64c
move _check() after timeouted queue.get() so deadlines are met accurately
2019-06-23 20:50:40 +01:00
jesopo
dd1df4dc05
move get_poll_timeout() to event loop now that it is the one calling _check
2019-06-23 19:00:37 +01:00
jesopo
9673963a8d
shift _check() call to event loop function so read_loop needn't call trigger()
2019-06-23 18:53:25 +01:00
jesopo
102aa1dce1
v1.10.0 release
2019-06-23 14:45:56 +01:00
jesopo
afc287f020
Don't print BitBotPanic stacks when we don't need to
2019-06-23 10:01:15 +01:00
jesopo
7861210495
v1.10.0-rc2
2019-06-23 09:45:47 +01:00
jesopo
22574448da
until_read_timeout is a func - read_timed_out has always been returning false
2019-06-22 23:31:06 +01:00
jesopo
01bad3a76e
Don't needlessly call time.monotonic() when checking cache expirations
2019-06-22 23:30:15 +01:00
jesopo
7d49826b1a
v1.10.0-rc1
2019-06-22 22:41:17 +01:00
jesopo
f1abc5f10c
remove remove_own_mode( check - deferred_read.py better solves the issue.
...
the issue was getting a MODE line on irc.com prior to 001, thus we didn't know
what our nickname was thus we didn't know that the MODE was for us. not dying
when we saw +x was easy to do with this check but I think it's more correct to
actually parse that MODE after 001 so we know we have +x.
2019-06-22 22:23:05 +01:00
jesopo
3eac36d0f5
Restrict EventManager calls to the main thread
2019-06-22 12:21:44 +01:00
jesopo
a783e71ad4
return generated SentLine objects from IRCChannel.send_* functions
2019-06-21 18:25:21 +01:00
jesopo
90c90e5bbd
Implement dependency system for CAPs
2019-06-21 18:05:11 +01:00
jesopo
8a0d99f969
Adda system of aliases for CAPs, mostly for changeable draft specs and creating
...
dependence between moving specs
2019-06-21 17:15:46 +01:00
jesopo
bffc5b0ec4
WARN log when we try to remove a mode from ourselves that we didn't have
2019-06-21 11:16:53 +01:00
jesopo
01438f28f6
check we have a mode before trying to remove it
2019-06-21 11:14:10 +01:00
jesopo
e7b17f2ccd
give every ParsedLine a uuid4 .id for tracking purposes
2019-06-21 10:33:59 +01:00
jesopo
01ddc04bb9
fix hostmask_match_many type hinting
2019-06-20 17:58:49 +01:00
jesopo
b6e194a450
Implement hostmask_match_any, for more efficient matching of multiple hostmasks
2019-06-20 14:21:11 +01:00
jesopo
792a42be6e
Implement utils.irc.hostmask_match() as regex
2019-06-20 14:10:10 +01:00
jesopo
612c26ff7e
Differentiate between module "not found" and "not loaded"
2019-06-19 23:11:42 +01:00
jesopo
928f2f304d
Raise ModuleNotFoundException on failure to find_module()
2019-06-19 23:05:22 +01:00
jesopo
dc9cd2869f
Give requested module name to ModuleNotFoundException
2019-06-19 23:03:27 +01:00
jesopo
9457430c15
Add MessageTag.present, to see if a tag is present (even without value)
2019-06-19 22:36:42 +01:00
jesopo
938e1db963
add margin
arg to ParsedLine.truncate so commands/outs.py doesn't do it
...
manually and cause potential issues with multi-byte chars
2019-06-19 10:34:42 +01:00
jesopo
c463fa20a4
line_formatted
-> valid
so tags don't cause us to subvert truncation
2019-06-18 18:14:04 +01:00
jesopo
1cbc2ce31b
Tags should not be appended to pieces
now that they're counted separately
2019-06-18 17:56:20 +01:00
jesopo
aa4a15a6dc
Add IRCBot.URL ( https://bitbot.dev )
2019-06-18 17:33:54 +01:00
jesopo
51cac7d9b5
add has_tag() and get_tag() to IRCLine.ParsedLine
2019-06-18 15:18:44 +01:00
jesopo
31be78db81
message-tags count for a different character limit than the rest of the line
2019-06-18 14:33:51 +01:00
jesopo
621830c360
Simplify SentLine by shifting truncation to ParsedLine (and commands.outs)
2019-06-18 14:14:37 +01:00
jesopo
133ff1c0f6
only count "\n"s (not "\r\n") that hit the wire, incase \r\n gets cut in half
2019-06-17 18:23:38 +01:00
jesopo
d4391cc6c5
Fix Database.ChannelSettings.find SQL
2019-06-17 17:51:27 +01:00
jesopo
5c325d9b23
'break' instead of 'continue' so that things in the event queue get discarded
2019-06-17 16:19:20 +01:00
jesopo
72ce880478
Only panic()
when a server connection is part of bot init. closes #69
2019-06-17 14:20:11 +01:00
jesopo
9121a868a8
Make sure we exit event loop when there's no servers left
2019-06-17 14:07:06 +01:00
jesopo
dbe0b1f43b
Tell servers objects when they are the result of a reconnection
2019-06-17 13:53:17 +01:00
jesopo
ec733e200c
Default IRCBot.running to false, set to true at the top of .run()
2019-06-17 11:35:45 +01:00
jesopo
da5d48400d
Change panic() reason log from ERROR to CRITICAL
2019-06-17 11:12:04 +01:00
jesopo
9ea356bc49
Raise a BitBotPanic() exception in panic()
2019-06-17 11:11:35 +01:00
jesopo
f8fa529ca5
Add IRCBot.panic() - a nicer interface for killing the whole application
2019-06-17 11:06:03 +01:00
jesopo
ced59a0f74
Allow channel-access and channel-mode check for channels people are not in
2019-06-16 20:48:31 +01:00
jesopo
18004c23e1
Don't fail get_kwarg when self.kwarg[name] is falsey
2019-06-16 18:39:56 +01:00
jesopo
5fa3d66a39
Return all caps through received.cap.ls|new and check if valid in line_handler,
...
remove server.cap_started
2019-06-16 15:33:20 +01:00
jesopo
919a488e86
Implement client-to-server BATCHes
2019-06-16 09:52:54 +01:00
jesopo
055eed24fd
Type annotate ParsedLine.tags, add ParsedLine.add_tag()
2019-06-16 09:52:25 +01:00
jesopo
8ab4880c5c
Change from yield
checks to a func in events
that pass up EventErrors
2019-06-15 18:42:14 +01:00
jesopo
b5a467552f
CRITICAL log exceptions caught in _loop_catch()
2019-06-15 00:39:52 +01:00
jesopo
e0d99fe8b1
Fix utils.Check args
type hinting
2019-06-14 12:12:38 +01:00
jesopo
f05fc209b0
Add a way to __or__ utils.Check
s, as a "if one of these passes" thing
2019-06-14 12:01:55 +01:00
jesopo
d7fa2cfa24
Catch yield
s in command callbacks for e.g. permission checks
2019-06-14 11:42:12 +01:00
jesopo
0e5ba747a9
Wrap _read_loop() and _write_loop() in a try that kills the main thread
2019-06-13 17:11:46 +01:00
jesopo
795f6afbeb
Mode mode (and mode arg) parsing to IRCChannel.py, add IRCChannel.mode_str
2019-06-13 11:53:47 +01:00
jesopo
8135f871c3
Change send_*()
function return hints to be typing.Optional
2019-06-10 15:02:03 +01:00
jesopo
6c5dc958d0
Add .assure()
to ParsedLine, to make it immune from .valid()
2019-06-10 10:45:02 +01:00
jesopo
0fc03fd592
Allow preprocess.send callbacks to request a line not be sent at all
2019-06-10 10:11:31 +01:00
jesopo
512d844a5a
Update CHANGELOG, v1.9.2 release
2019-06-09 17:34:45 +01:00
jesopo
a31793c851
Put responsbility of self.running = False
on to the event loop
2019-06-09 14:59:28 +01:00
jesopo
e28a8d91ab
IRCServer.statusmsg type hint
2019-06-08 12:10:14 +01:00
jesopo
55fb9cee3b
v1.9.1 release
2019-06-08 11:03:18 +01:00
jesopo
d4ba98307f
We should look at ISUPPORT's STATUSMSG token instead of PREFIX
2019-06-08 10:59:52 +01:00
jesopo
16b9361371
Only request a CAP once. closes #66
2019-06-08 10:17:13 +01:00
jesopo
37c74da0f8
v1.9.0 release
2019-06-07 17:13:53 +01:00
jesopo
f822345976
Merge branch 'master' into feature/write-thread
2019-06-07 15:07:31 +01:00
jesopo
accd7a8941
Logging._log()'s params
arg should be typing.Optiona[]
2019-06-07 13:35:20 +01:00
jesopo
ea924df883
typehint for IRCBuffer._lines
2019-06-07 13:34:30 +01:00
jesopo
bc4a6debb5
Use a deque for temp chathistory storage (src/IRCBuffer.py)
2019-06-07 13:31:51 +01:00
jesopo
38a41a6404
We need to wait for _check to finish so read/writes can be triggered correctly
2019-06-07 11:05:55 +01:00
jesopo
09fbbae5e3
"send" event on SentLines should be run on the main thread
2019-06-07 11:05:43 +01:00
jesopo
b3b4d07e63
Call _check *after* read epoll call - to make sure timeouts are hit accurately
2019-06-07 10:39:31 +01:00
jesopo
f3b6d6df0a
Switch to using threading.Condition to trigger write thread
2019-06-07 10:39:19 +01:00
jesopo
1f1b63ea6d
Checking if we should enable write buffer should be in _fill_throttle()
2019-06-07 08:02:22 +01:00
jesopo
c89bd74a48
select.poll, as opposed to select.epoll, uses milliseconds not seconds for
...
timeout
2019-06-06 23:45:33 +01:00
jesopo
23d2993b9f
Remove debug print
2019-06-06 23:25:03 +01:00
jesopo
6d44f12193
Use .trigger (without triggering read/write threads) to call _check
2019-06-06 23:23:46 +01:00
jesopo
24ca7ed97f
use trigger_write() instead of a raw .send(b"")
2019-06-06 23:19:57 +01:00
jesopo
ef0c2c65e0
use _event_queue for _check, don't .disconnect() from outside of respective
...
loops
2019-06-06 22:36:56 +01:00
jesopo
ae6c65d743
remove _trigger_function code, it's not used any more
2019-06-06 21:43:21 +01:00
jesopo
d9de4fdec2
Lambda scopes are irritating
2019-06-06 21:03:25 +01:00
jesopo
539bebafea
select.epoll -> select.poll
2019-06-06 20:26:05 +01:00
jesopo
0f7b040165
call timer callbacks and expire cach objects on main thread
2019-06-06 20:22:56 +01:00
jesopo
5b7d8dea91
Only trigger read/write threads once
2019-06-06 19:21:18 +01:00
jesopo
05fcb33ff7
print lines as soon as they're read, don't wait for _post_send
2019-06-06 19:15:34 +01:00
jesopo
f96378ac07
move immediate-write-trigger to IRCServer.py, trigger _event_loop for
...
running=False
2019-06-06 17:58:35 +01:00
jesopo
35b97f836a
Merge branch 'master' into feature/write-thread
2019-06-06 17:20:30 +01:00
jesopo
59eeee1030
message-tags are joined by ";", not ","
2019-06-06 17:19:27 +01:00
jesopo
a1ebe8035e
Split read/write/process in to 3 different threads
2019-06-06 17:05:44 +01:00
jesopo
2ca4fd48f7
Make params
arg for logging functions optional
2019-06-06 12:59:47 +01:00
jesopo
eb7d90bb00
message_tag_escape() message-tag values when .format()ing IRCLine
2019-06-06 09:29:17 +01:00
jesopo
8fe5098739
Make 'circular dependency' WARN more explicitly about 1-to-1 dependencies
2019-06-05 19:13:44 +01:00
jesopo
67b4aa69e2
check_purge() after removing a context as it could make a hook purgable
2019-06-05 16:56:02 +01:00
jesopo
2d46fe0cbf
labels: Use BatchType to match, pass lines
not line
, batch ID isn't a label,
...
fire event on label response
2019-06-04 17:54:19 +01:00
jesopo
2470c1ec03
Add new BatchType object, to match like how Capability and MessageTag do
2019-06-04 17:51:55 +01:00
jesopo
8dbae6a5e9
Give SentLine (and preproc.send events) a new event object, to track events
...
related to a line after it is sent
2019-06-04 17:51:20 +01:00
jesopo
3ac01197f2
Send PING and PONG as 'immediate' lines
2019-06-04 14:31:34 +01:00
jesopo
4a4d0a37d7
Only return definitely-writen lines from IRCSocket._send, refactor in prep for
...
lines that request to be sent 'immediately'
2019-06-04 14:28:35 +01:00
jesopo
a802e66dcf
Defer decoding http payload bytestring until after checking ContentType
2019-06-04 13:47:03 +01:00
jesopo
ef221f4165
v1.8.0 release
2019-06-03 13:30:39 +01:00
jesopo
c212d70b68
Hold on to BATCH args, allow event hooks to manipulate batches
2019-06-02 15:18:36 +01:00
jesopo
5204ac3300
fix some CAP related type hints
2019-06-02 10:14:09 +01:00
jesopo
f9f637e084
Remove IRCSendBatch, fix some batch-related type hints
2019-06-02 10:13:51 +01:00
jesopo
20c027fd0b
check if we should enable write throttling before writing, clear _recent_sends
...
when we turn on throttling and only "turn on" throttling once
2019-06-01 22:28:57 +01:00
jesopo
b84d133500
add __str__ and __repr__ defs to IRCLine.ParsedLine
2019-06-01 22:28:37 +01:00
jesopo
e5c11f4aef
add 'module-blacklist/whitelist' to bot.conf - use that as well as DB setting
2019-06-01 15:06:57 +01:00
jesopo
5077bad522
list()-ify filter()
return, otherwise boolean checks against it are wrong
2019-06-01 15:05:57 +01:00
jesopo
c3454f2bfe
available_capability returns str
- fix type hint for this
2019-06-01 15:02:38 +01:00
jesopo
dc284bab4a
Only enable write throttling when _write_buffer is empty
...
closes #59
2019-05-31 15:49:34 +01:00
jesopo
f2cf86b8c0
More explicitly require throttle_done()
only for _queued_lines
2019-05-31 15:32:55 +01:00
jesopo
a3a61d2e86
Log server name when we see a _send failure
2019-05-30 15:46:01 +01:00
jesopo
367eb1c60e
Make labeled-resposnes it's own module, tag and track every sent line
2019-05-30 15:36:10 +01:00
jesopo
f0dee5ebd6
Immutable arg default values leads to weird data persistence
2019-05-30 15:30:15 +01:00
jesopo
b8f778d7bd
Only try to send QUITs on ctrl+c when we're connected - sys.exit otherwise
2019-05-29 16:11:47 +01:00
jesopo
768059fcf4
Switch resume.py to use the last server-time
it saw, not last .recv()
2019-05-29 15:53:20 +01:00
jesopo
0be9046669
Pass str object to BeautifulSoup, not bytes. closes #56
2019-05-28 10:22:35 +01:00
jesopo
69a780b596
append ".py" when doing find_module on ModuleType.FILE
2019-05-27 16:56:13 +01:00
jesopo
786f04ea16
set changed = True
when we pop a module with no dependencies left
2019-05-27 14:50:15 +01:00
jesopo
ce3a0668c6
Throw an exception when we detect a complex circular dependency
2019-05-27 11:42:47 +01:00
jesopo
5b780672a8
Enable TCP keepalives
2019-05-27 07:58:24 +01:00
jesopo
2a93a8f1dd
Only check for unknown dependencies once
2019-05-26 20:27:17 +01:00
jesopo
38dd69a71e
Only iterate a module's deps, not all modules, when checking for circular deps
2019-05-26 14:47:05 +01:00
jesopo
4048f63538
'cicular' -> 'circular', words are hard
2019-05-26 11:25:52 +01:00
jesopo
9815ddac8a
'cycular' -> 'cicular'
2019-05-26 06:54:29 +01:00
jesopo
69a1f42ecc
Add basic comments for dependency-sorting system
2019-05-25 21:47:28 +01:00
jesopo
bb475d5cc8
Implement ordering modules by depends-on
hashflag
2019-05-25 21:43:32 +01:00
jesopo
eeee2458d3
Fix utils.parse.hashflags type hints
2019-05-25 21:42:42 +01:00
jesopo
552902d462
Refactor ModuleManager
2019-05-25 18:24:50 +01:00
jesopo
d0634bb54e
Don't store hashflags as a dict before returning them - allow duplicate keys
2019-05-25 12:58:07 +01:00
jesopo
a3a2c1e5a4
Store IRCSocket connect_time, show bytes read/write per second in stats.py
2019-05-24 17:32:59 +01:00
jesopo
503969abfd
Bump version to v1.7.1
2019-05-24 06:52:25 +01:00
jesopo
b12298135e
Bump version to v1.7.0
2019-05-23 19:10:22 +01:00
jesopo
6678076490
Remove column from server.add SQL (leftover from removing 'ipv4' column)
2019-05-21 10:45:24 +01:00
jesopo
ab1074cf4d
Remove mention of ipv4
- detect address family automatically
2019-05-21 10:11:09 +01:00
jesopo
db33e12c8c
Remove Capability.enabled() - it's unused
2019-05-20 16:36:02 +01:00
jesopo
b12c38c326
typing.List
-> typing.Sequence
2019-05-20 16:35:50 +01:00
jesopo
bdd161256d
has_capability
-> has_capability_str
, add new has_capability
2019-05-20 16:33:32 +01:00
jesopo
3ad83655d5
ParsedLine already deals with preventing newlines
2019-05-20 16:19:37 +01:00
jesopo
e752b60f6c
use fnmatchcase( so the strings are not case-"normalised"
2019-05-19 16:28:46 +01:00
jesopo
c607a0e67c
Implement utils.irc.hostmask_match for glob-like hostmask matching
2019-05-19 16:24:38 +01:00
jesopo
58d6b16744
Remove _name and _draft_name (unused) and add Capability.copy()
2019-05-19 11:00:58 +01:00
jesopo
7671dd2086
Switch back to events.name defaulting to None, use typing.cast to fix linting
...
error
2019-05-18 21:14:28 +01:00
jesopo
105351d6f3
Add a timestamp to recent_sends for EACH line sent
2019-05-18 19:08:34 +01:00
jesopo
d64d12f8fd
give EventCallbacks their event name
2019-05-18 18:35:23 +01:00
jesopo
eccd43d357
Add a way to not put spaces between docstring lines when stripping \n
2019-05-18 18:34:27 +01:00
jesopo
bea8556329
Bump version to v1.6.0
2019-05-17 13:39:55 +01:00
jesopo
7547eee96d
Catch server version string, from RPL_MYINFO
2019-05-15 17:12:21 +01:00
jesopo
a80eda614d
Add IRCBot.SOURCE, use it in ctcp.py
2019-05-15 10:30:36 +01:00
jesopo
38ba656bda
Add type hints to utils.irc.MessageTag
2019-05-14 23:07:42 +01:00
jesopo
421d9c10c7
Add utils.irc.MessageTag and use it for both draft and ratified msgid
2019-05-14 13:02:45 +01:00
jesopo
1c296826d7
Move module black/white list to IRCBot, allow "safe" loading of all modules
2019-05-12 14:10:59 +01:00
jesopo
d291cd5063
Revamp how CAPs are tracked through REQ and ACK/NAK etc
2019-05-11 18:22:40 +01:00
jesopo
295f7a751c
Refactor CAPs in to objects
2019-05-11 15:11:09 +01:00
jesopo
091818fa32
Hold context in EventCallback objects, add name<->context translation in
...
ModuleManager
2019-05-10 16:11:22 +01:00
jesopo
f7eae1a978
Tokenize IRC data as soon as it comes out of IRCServer
2019-05-09 10:36:33 +01:00
jesopo
920dce0221
Add IRCServer.has_user_id, to check if we've seen a user before
2019-05-05 00:16:37 +01:00
Patrick Nappa
2c344c9ddd
forgot the beautiful %
2019-05-03 13:50:51 +10:00
Patrick Nappa
471c11e229
ensure that non-url characters not separated by whitespace aren't consumed
2019-05-03 13:43:08 +10:00
jesopo
e844004ba1
Fix reconnect() type hint issues
2019-05-01 17:13:55 +01:00
jesopo
aa1b457632
Change TRIGGER_RETURN and TRIGGER_EXCEPTION to an enum
2019-05-01 17:13:41 +01:00
jesopo
992ab15394
Bump version to v1.5.0
2019-04-30 12:05:59 +01:00
jesopo
280e647a84
Only pass through args
from connection params when reconnecting
2019-04-30 12:05:36 +01:00
jesopo
0afe798b83
Support parsing iso8601 with microseconds
2019-04-28 12:11:48 +01:00
jesopo
74c16a1bbe
Actually respect default return in Exports.get_one
2019-04-27 14:49:18 +01:00
jesopo
bdcb4b5db2
Add missing ":"
2019-04-25 17:50:41 +01:00
jesopo
1240b154cb
Support interfaces that don't have AF_INET and/or AF_INET6
2019-04-25 17:48:51 +01:00
jesopo
7643a962bd
Refuse to get the title for any url that points locall
2019-04-25 15:58:58 +01:00
jesopo
dffee4d223
Move REGEX_URL out of isgd.py and title.py in to utils.http
2019-04-24 15:46:54 +01:00
jesopo
e095c56f77
Record and show when a !to was created
2019-04-24 14:32:56 +01:00
jesopo
dc102f258d
Add Database.servers.get_by_alias, move IRCBot.get_server to
...
IRCBot.get_server_by_id, add IRCBot.get_server_by_alias and change
!connect/!disconnect to take aliases instead of IDs
2019-04-24 12:07:30 +01:00
jesopo
bd4fdfdc7b
Add UNIQUE constraint for alias
on servers
table
2019-04-24 11:49:54 +01:00
jesopo
032f6fbc3b
IRCServer.alias is no longer optional
2019-04-24 11:45:21 +01:00
jesopo
87340bcbf9
change utils.iso8601_format to default to no milliseconds, switch to using
...
utils.iso8601 functions in badges.py
2019-04-23 21:27:43 +01:00
jesopo
ee8c7813f7
Add IRCServer.send_raw so modules don't have to parse messages before sending
...
them
2019-04-16 13:47:45 +01:00
jesopo
34848324d5
Bump version to v1.4.0
2019-04-16 09:59:40 +01:00
jesopo
272b60842e
'IRCChannels._get_id' -> 'IRCChannels.get_id'
2019-04-07 13:59:53 +01:00
jesopo
0eaeca8f83
Put spaces between units in output from utils.to_pretty_time
2019-03-21 17:59:42 +00:00
jesopo
10ca8a1219
Add IRCUser.hostmask() to format nick/user/host in to a hostmask
2019-03-12 10:39:54 +00:00
jesopo
5d7f017c9c
Enum values shouldn't be all upper case
2019-03-10 13:14:25 +00:00
jesopo
1fcbdd305c
'failed to connect' log line needs 2 "%s"s
2019-03-09 20:21:15 +00:00
jesopo
5c5b4ef139
Handle negative (end-relative) indexes being given to IRCArgs.get
2019-03-08 23:35:52 +00:00
jesopo
f1348e5679
Handle IRCArgs being empty strings (e.g. 'PRIVMSG #test :')
2019-03-08 23:23:09 +00:00
jesopo
b3472c009a
Only log exception message, not full stacktrace, when a connect fails
2019-03-08 10:12:01 +00:00
jesopo
6b59830a6e
Only print ANSI reset characters when appropriate
2019-03-06 21:48:31 +00:00
jesopo
1b7a8bc896
Log content of lines that need fallback encoding
2019-03-06 17:19:37 +00:00
jesopo
c842c459f4
Specifically only catch UnicodeDecodeError in IRCSocket.read
2019-03-06 17:02:58 +00:00
jesopo
11c4d70156
add IRCServer.clear_send_buffer() to clear queued lines
2019-03-05 11:35:24 +00:00
jesopo
91c2ab03ba
add IRCServer.send_enabled, to prevent sending after QUIT in signals.py
2019-03-05 11:29:46 +00:00
jesopo
b43a5a7c74
Add -N to start.py to disable to-file logging
2019-03-04 19:35:18 +00:00
jesopo
7a3db82300
Add IRCServer.has_capability and use it throughout line_handler
2019-03-03 22:38:34 +00:00
jesopo
197ae2e053
Raise a specific exception in utils.http.request for "wrong content type"
2019-02-28 23:28:45 +00:00
jesopo
948c86adbc
Need to str() Hostmask objects in ParsedLine.format()
2019-02-28 16:22:17 +00:00
jesopo
9335ca5d16
Treat both a
and a=
as None for message-tags
2019-02-27 22:20:01 +00:00
jesopo
d16046fb49
Simplify ParsedLine._tag_str and ParsedLine.format()
2019-02-27 22:14:53 +00:00
jesopo
846b881e52
Throw ValueError when utils.http.request tries to soup non-html/xml data
2019-02-27 15:16:08 +00:00
jesopo
cfaf6864fc
Don't try to parse non-html/xml stuff with BeautifulSoup
2019-02-26 11:18:50 +00:00
jesopo
5aaf6eb7df
Bump version to v1.2.1
2019-02-25 21:47:36 +00:00
jesopo
56f6511ad3
Critical security fix: truncate IRCLine.ParsedLine.format() at newline
2019-02-25 21:46:23 +00:00
jesopo
d627ed49e2
Pull "is main thread" logic out to utils, force Database to be accessed on main
...
thread
2019-02-25 10:36:17 +00:00
jesopo
faa305f2e8
Add -m/-M args to ./start.py that call command_line
on individual modules
2019-02-24 10:43:46 +00:00
jesopo
276d753711
Change --verbose short to -V, add --version/-v, add IRCBot.VERSION
2019-02-24 08:37:42 +00:00
jesopo
8d55319f56
Rename IRCLine.Line to IRCLine.SentLine, for clarity
2019-02-24 08:25:12 +00:00
jesopo
1473f41b03
Fire preprocess.send per-command - use this to only strip colors from ParsedLine
...
objects for PRIVMSG and NOTICE
2019-02-23 21:40:11 +00:00
jesopo
5baa688fbc
Make IRCArgs mutable
2019-02-23 21:39:46 +00:00
jesopo
8c94bcf6ca
Move utils.irc.IRCParsedLine to IRCLine.ParsedLine, improve truncation
...
mechanism, don't convert sent line from ParsedLine to text to ParsedLine for
line_handler handling
2019-02-23 21:33:04 +00:00
jesopo
c6699c509e
.upper() command in IRCParsedLine.format()
2019-02-23 16:11:26 +00:00
jesopo
54218b747f
Only allow the last arg of a formatted line to be :trailing
2019-02-23 16:07:20 +00:00
jesopo
8b54046ca4
Add target
typehint on IRCServer.send_tagmsg, add send_tagmsg to IRCChannel/IRCUser
2019-02-22 22:34:54 +00:00
jesopo
9d72cbca73
Keep track of a user's away message, not just whether they're away or not
2019-02-22 22:26:50 +00:00
jesopo
8a0fd009e4
Also unload submodules within packages (ModuleManager.py)
2019-02-22 17:58:53 +00:00
jesopo
47c2cbb0fa
Split line_handler.py out in to different files for different categories
2019-02-22 11:23:36 +00:00
jesopo
62eab40968
Revert "Treat both a
and a=
as having a value of None in message-tags (utils.irc)"
...
This reverts commit e7ec4b5716
.
2019-02-21 07:29:19 +00:00
jesopo
e7ec4b5716
Treat both a
and a=
as having a value of None in message-tags (utils.irc)
2019-02-20 22:26:31 +00:00
jesopo
deedab7248
Add IRCServer.send_joins, a nicer interface than manually ",".join
ing
2019-02-20 17:08:30 +00:00
jesopo
ddb69685d3
again, r"\"
isn't valid.
2019-02-20 16:53:40 +00:00
jesopo
e343bf3e6a
Check throttle space when queueing more data not whether there's no queued data
2019-02-20 16:52:45 +00:00
jesopo
98215f66eb
r"\"
isn't valid - use "\\"
(utils.irc)
2019-02-20 16:52:14 +00:00
jesopo
c1881fbafb
Remove '\' from post-unescaped message-tags
2019-02-20 16:34:14 +00:00
jesopo
47841ed154
don't replace '\\' with '\\' with message-tag unescape
2019-02-20 16:33:48 +00:00
jesopo
81d82413d4
draft/message-tags-0.3 (JSON tags) was rejected
2019-02-20 14:46:40 +00:00
jesopo
577fae7cea
Don't pass None
around as tag default, fix some missing return type args
2019-02-19 15:57:00 +00:00
jesopo
3f8ac871ed
typo, 'utls' -> 'utils' (utils.irc)
2019-02-19 15:44:23 +00:00
jesopo
114d1054a5
Add .message(
and .notice(
to IRCSendBatch
2019-02-19 15:41:17 +00:00
jesopo
bc772ef5cc
Default IRCParsedLine.tags to empty dict, not None
2019-02-19 15:40:56 +00:00
jesopo
53e5a7fe7e
contextualise JOIN key check, otherwise it doesn't send channel_name
2019-02-19 09:32:17 +00:00
jesopo
9f946e236d
copy paste fail, batch end should be "-" not "+"
2019-02-19 08:25:25 +00:00
jesopo
81ae0cc889
Add make_batch
and send_batch
to IRCServer
2019-02-18 23:16:47 +00:00
jesopo
b76b153672
Add batch_start and batch_end to utils.irc.protocol
2019-02-18 23:11:36 +00:00
jesopo
509a7ff42e
Default tags
to null for utils.irc.protocol's message
and notice
2019-02-18 23:06:41 +00:00
jesopo
07cb14d98c
utils.irc.protocol.join()'s keys
param should be typing.Optional
2019-02-18 23:03:21 +00:00
jesopo
3bb917b619
Add src/utils/irc/__init__.py that should have been added some commits ago
2019-02-18 23:00:50 +00:00
jesopo
cd97a653cc
Don't try to use keys
if we try to join a channel without any keys
2019-02-18 15:00:05 +00:00
jesopo
186b6b82a2
Shift formatting protocol data to it's own file: utils.irc.protocol
2019-02-18 14:58:27 +00:00
jesopo
d937145f93
Add missing :
2019-02-18 13:54:09 +00:00
jesopo
6da35a899b
don't pass around has_arbitrary
- we don't need it.
2019-02-18 12:42:52 +00:00
jesopo
cb0314da67
Put a helper function in utils to do iso8601 formatting. change IRCServer's
...
last-read setting to use it.
2019-02-17 14:15:40 +00:00
jesopo
be495344d4
How did this newline get here
2019-02-17 12:40:31 +00:00
jesopo
716568c21d
'src/IRCServer.capabilities' -> 'src/IRCServer.agreed_capabilities'
2019-02-16 09:12:43 +00:00
jesopo
23b0e58665
Send CAP REQ
in 10-item chunks (src/IRCServer.py)
2019-02-16 08:21:42 +00:00
jesopo
ed99d66163
Don't add a space after a formatted tagmsg in _tag_str (src/IRCServer.py)
2019-02-14 21:59:26 +00:00
jesopo
8d97e51bf3
Add IRCServer.send_tagmsg, to send TAGMSG
commands
2019-02-14 21:36:59 +00:00
jesopo
708ba2ddc7
Support one-shot event hooks (src/EventManager.py)
2019-02-14 10:36:11 +00:00
jesopo
1136162057
Fix 'Optional[str]!=str' type hinting issue in utils.irc line parsing
2019-02-13 11:00:22 +00:00
jesopo
e1de8cd9be
We were just checking if arbitrary
was falsey, thus losing empty trailing args
...
(' :' with nothing after it) (utils.irc)
2019-02-12 20:42:09 +00:00
jesopo
b4092a14ca
Also strip \x01 off the start of CTCP commands, if it's there (utils.irc)
2019-02-12 16:49:24 +00:00
jesopo
86bc49a0a1
Only put a ":" on trailing args when it's required
2019-02-12 13:55:57 +00:00
jesopo
01a7c05687
Change arg types of constant_time_compare to typing.AnyStr (utils.security)
2019-02-12 11:59:55 +00:00
jesopo
9667b8a6e0
Move constant-time compare function to utils.security
2019-02-12 11:57:49 +00:00
jesopo
144182868c
Upgrade resume.py to draft/resume-0.3
and support sending last-read timestamp
2019-02-12 11:14:36 +00:00
jesopo
8c9626f0a9
Put an strf format for ISO8601 in utils
2019-02-12 11:08:24 +00:00
jesopo
2f5a232c4e
Hold on to tags and type for BATCHes
2019-02-11 22:15:12 +00:00
jesopo
b37a50ed7a
IRCServer should handle ping_sent, not IRCSocket
2019-02-11 21:23:52 +00:00
jesopo
a8d9365442
last_read/last_send is now handled by IRCSocket.py
2019-02-11 20:49:53 +00:00
jesopo
6c6f1f9c2b
socket.getpeername()
can return more than 2 values (IRCSocket)
2019-02-11 20:34:15 +00:00
jesopo
137d5b1a58
connected
status is now tracked by IRCSockets
2019-02-11 20:34:02 +00:00
jesopo
48fe6b7391
Add IRCSocket.connected_ip
to hold on to the IP address we connected to (e.g.
...
so we know which IP we picked from a round robin DNS)
2019-02-11 16:10:23 +00:00
jesopo
9b44b6cd13
Shift socket.socket related logic to IRCSocket.py
2019-02-11 10:00:41 +00:00
jesopo
b6b7345764
We don't need to send writebuffer.empty
event any more (src/IRCServer.py)
2019-02-11 00:00:58 +00:00
jesopo
63dc5009f7
Actually return str
object from IRCLine.__str__
2019-02-10 23:57:38 +00:00
jesopo
1d48f6f19d
Add _char_limit return type hint, fix decoded_data return type hint
...
(src/IRCLine.py)
2019-02-10 23:52:25 +00:00
jesopo
ecb197858e
Import IRCServer in IRCLine so type hint comment is valid (src/IRCLine.py)
2019-02-10 23:51:28 +00:00
jesopo
f8e6a55ada
Add a comment as to why IRCLine's LINE_CUTOFF is 470, not 510
2019-02-10 22:52:23 +00:00
jesopo
fc5ade7112
Change LINE_CUTOFF to 470, now that we compute max char counts (src/IRCLine.py)
2019-02-10 20:54:12 +00:00
jesopo
bb4ec082dd
Let IRCLine.Line handle truncating command output
2019-02-10 20:49:59 +00:00
jesopo
abf5679b68
Parse sent data in IRCServer._send, not IRCServer.send
2019-02-10 20:49:03 +00:00
jesopo
89f035fdcf
Add IRCServer.hostmask()
to construct our nick!user@host hostmask
2019-02-10 20:44:29 +00:00
jesopo
a3b9be3d3d
Shift encoding/truncating IRC lines to src/IRCLine.py
2019-02-10 18:43:04 +00:00
jesopo
bd9eaad0b2
Return truncted data from encode_truncate and hold it in IRCLine.Line
2019-02-10 18:16:19 +00:00
jesopo
7952d4c366
Make use of utils.truncate_encode, to avoid cutting utf8 sequences in half
2019-02-10 16:48:08 +00:00
jesopo
f2c762a2d0
add utils.truncate_encode
, to encode and truncate a string while respecting utf8 multi-byte encoding
2019-02-10 16:41:56 +00:00
jesopo
b744281e3d
Don't send empty space with JOIN if key=="" (src/IRCServer.py)
2019-02-10 15:02:24 +00:00
jesopo
d62b8c79fd
Return IRCLine object from IRCServer.send() (and functions that call .send())
2019-02-10 14:21:14 +00:00
jesopo
8e03bc66af
fix self.batches
type hint (src/IRCServer.py)
2019-02-10 14:20:40 +00:00
jesopo
eb00f331e5
IRCLine's data
should be bytes
2019-02-10 14:19:43 +00:00
jesopo
4772564115
Add missing src/IRCLine.py file
2019-02-10 14:18:33 +00:00
jesopo
28107292f5
now
isn't defined now that throttle code has been separated out (src/IRCServer.py)
2019-02-10 14:12:39 +00:00
jesopo
7792be247c
Track lines-to-be-sent up until they're completely sent, queue up more than 1
...
line at a time in write buffer if we've got space (src/IRCServer.py)
2019-02-10 14:09:27 +00:00
jesopo
7f7941f564
rename, 'IRCLine' -> 'IRCParsedLine' (utils.irc)
2019-02-10 14:08:59 +00:00
jesopo
23da45bebc
Make line cutoff character count a const (src/IRCServer.py)
2019-02-10 14:08:07 +00:00
jesopo
41503ab5ae
Add TimersContext.find_all
2019-02-10 13:01:52 +00:00
jesopo
7704de25b6
Add Timers.find_all, to find all timers of a certain name
2019-02-10 12:58:15 +00:00
jesopo
e558a7676b
Abstract ssl socket wrapping away so we can reuse it
2019-02-10 12:36:52 +00:00
jesopo
1d807fefe0
Old copypaste fail - we were returning the most recent user id when creating channels
...
(Database.py)
2019-02-10 00:04:00 +00:00
jesopo
b44c456081
Set default values for various types of channel modes (src/IRCServer.py)
2019-02-09 18:52:59 +00:00
jesopo
84a3bf6135
Also capture channel setting-related modes (e.g. +f for flood settings)
2019-02-09 18:48:18 +00:00
jesopo
d86a0fc55c
Return "0s" from utils.to_pretty_time when given 0 seconds
2019-02-07 22:47:03 +00:00
jesopo
bae98d1236
Send CAP LS
after we send PASS
(if applicable) (src/IRCServer.py)
2019-02-07 17:41:10 +00:00
jesopo
76fd67235a
Add optional default
param to Exports.get_one()
(src/Exports.py)
2019-02-07 13:36:34 +00:00
jesopo
e124b8e79d
Implement ExportsContext.get_one
2019-02-07 10:10:13 +00:00
jesopo
8c1c10b3c7
Implement Exports.get_one()
2019-02-07 10:02:27 +00:00
jesopo
f94f233eb3
Fix mypy typing issue with importspec loader Optionalness (src/ModuleManager.py)
2019-02-06 22:41:37 +00:00
jesopo
1895ac34d7
If a server has a hostname that's not an IP, use it as SNI server name
2019-02-06 18:11:19 +00:00
jesopo
70b29a345a
Don't break if we try to "finish" a waiting CAP when it's already finished
2019-02-06 15:44:09 +00:00
jesopo
2f7937adc5
Don't .lower() nicknames in Database.py, it doesn't know about IRC casemapping
2019-02-06 11:25:20 +00:00
jesopo
cbbe6f1569
STARTTLS was removed long ago
2019-02-05 22:26:41 +00:00
jesopo
5991e02b0a
Manually count ACK/NAK for REQed CAPs before ENDing CAP negotiation
2019-02-05 19:20:02 +00:00
jesopo
c311521a31
Switch to using __init__.py as main file of directory modules, so they behave
...
like a package (also put the modules manually in sys.modules
2019-02-05 15:53:11 +00:00
jesopo
607c6eddf9
Switch to a non-deprecated method of loading files by filename
...
(`importlib.util.spec_from_file_location`)
2019-02-05 13:34:13 +00:00
jesopo
5dda000c96
Add make_event(..)
to EventHookContext
2019-01-30 19:37:52 +00:00
jesopo
72072bbd3d
Make sure to call the specific hook we've decided is valid (commands.py)
2019-01-30 19:35:43 +00:00
jesopo
d10a6d94c1
Add a way to force success and force failure of a command permission check
...
(commands.py)
2019-01-28 23:29:52 +00:00
jesopo
cc8478c50c
Only search messages from other users in find_from
(src/IRCBuffer.py)
2019-01-26 15:58:57 +00:00
jesopo
e1e4fbf9bc
Add find_from
to IRCBuffer.Buffer, to find the most recent line from a given
...
user (src/IRCBuffer.py)
2019-01-26 15:46:20 +00:00
jesopo
8dcd6b2937
Make sure more than one hook can catch preprocess.send
but still respect any
...
that return a change to the output (src/IRCServer.py)
2019-01-26 11:05:25 +00:00
jesopo
1a24f17375
IRCServer.Server.irc_lower
should have a return type hint of str
2019-01-24 17:15:02 +00:00
jesopo
3df6b39228
Typo, IRCServer.Server.irc_equal
-> IRCServer.Server.irc_equals
2019-01-24 17:13:51 +00:00
jesopo
301dd7378a
Add irc_lower()
and irc_equals()
to IRCServer.Server so that no where else
...
in the code has to know about the server having a casemapping
2019-01-24 17:12:50 +00:00
jesopo
baeff58539
Fix incorrect indentation level in Logging.py
2019-01-18 16:28:09 +00:00
jesopo
69edf039b3
Support modules being in their own folder and move github.py to github/module.py
2019-01-18 12:49:11 +00:00
jesopo
4c5af0845c
output of len()
needs to have a -1
on it when matching it against indexes
...
within the given string (src/utils/irc.py)
2019-01-16 12:42:45 +00:00
jesopo
2331205368
Don't ignore a color code when it's right at the end of a message
...
(src/utils/irc.py)
2019-01-16 12:41:41 +00:00
jesopo
470f85b009
Pushing logging on to another thread was a ridiculous idea. it means CRITICAL
...
logs are in a race condition to write to file before the main thread exits.
2019-01-16 12:03:56 +00:00
jesopo
6405ee2582
Support removal of modes without args that we don't know about in a way that
...
doesn't push code execution down the wrong path (src/IRCChannel.py)
2019-01-16 11:59:36 +00:00
jesopo
aa40936ce6
Support a mode being removed from a channel, without an arg, that we weren't yet
...
aware of (src/IRCChannel.py)
2019-01-16 11:47:42 +00:00
jesopo
8ed89b3f31
Add src/utils/_consts_256_color.py that should have been added 2 commits ago
2019-01-16 11:25:40 +00:00
jesopo
3b75519fb0
Fix regression that caused only foreground to be parsed if there's foreground
...
AND background formatting (src.utils.irc)
2019-01-16 11:24:47 +00:00
jesopo
8f4312d002
Support IRC colors 16 through 98
2019-01-16 11:18:51 +00:00
jesopo
598fcb80b9
'to_ansi_colors(' -> 'parse_format(' as it's become a lot more than just colors.
...
strip \x08 (in case hexchat users paste it) (print_activity.py, src.utils.irc)
2019-01-13 21:56:36 +00:00
jesopo
97b7249989
don't consume 3 digits for a colour code when the first char is 0 and the second
...
two chars make up a valid colour code (src.utils.irc)
2019-01-13 01:54:02 +00:00
jesopo
9944f08acf
Typo, '=' -> '==' (utils.irc)
2018-12-12 11:50:59 +00:00
jesopo
d5467aefe9
Support '99' as a 'transparent' irc color code
2018-12-12 11:49:42 +00:00
jesopo
85840a68dd
Preserve logged exc_info across threads
2018-12-12 11:33:29 +00:00
jesopo
2d3bb2b5e8
Typo in utils.http.request, 'response_heders' -> 'response_headers'
2018-12-11 22:31:14 +00:00
jesopo
5b59740043
Pass a dict
to utils.CaseInsensitiveDict, not a MutableMapping
2018-12-11 22:30:57 +00:00
jesopo
d373edfaae
Add missing utils
import in utils.http
2018-12-11 22:30:05 +00:00
jesopo
793d234a0b
'utils.http.get_url' -> 'utils.http.request', return a Response object from
...
utils.http.request
2018-12-11 22:26:38 +00:00
jesopo
f77c443ac1
Add type hint for Logging._queue
2018-12-10 13:38:49 +00:00
jesopo
312293b221
Make block
param of queue.get() explicitly refer to block
2018-12-10 13:34:53 +00:00
jesopo
df8135f105
Put logging functionality on to it's own thread
2018-12-10 13:18:15 +00:00
jesopo
dea63d9cf2
By the time we take ref counts, we've already removed module
from
...
`loaded_module`
2018-12-09 11:24:05 +00:00
jesopo
8c3f87b029
change self.modules
to be a dict of str:LoadedModule, not str:BaseModule
2018-12-09 11:22:30 +00:00
jesopo
ac71cfa4fa
Add missing change to loaded_module.module
(from module
) in unload_module
2018-12-09 11:20:55 +00:00
jesopo
91beadd1cd
def LoadedModule
-> class LoadedModule
2018-12-09 11:18:55 +00:00
jesopo
6935c926dc
Don't store any information used to load/unload modules on the module it's self
...
thus preventing even the possibility that modules can change them
2018-12-09 11:15:04 +00:00
jesopo
1c546a8244
Add typing hints to CaseInsensitiveDict, fix it's __setitem__ signature, call
...
.items() on `other` in ctor
2018-12-08 09:13:01 +00:00
jesopo
9bef4b7df1
Switch to using a case insensitive dictionary for headers instead of doing
...
.title() on each header key
2018-12-08 09:00:12 +00:00
jesopo
bae1fac147
Add returns
type hint in EventManager.py.call
2018-12-06 10:15:12 +00:00
jesopo
809efc6793
Only pop MODE args when we're certain we should (pays more attention to
...
CHANMODES ISUPPORT)
2018-12-06 08:26:07 +00:00
jesopo
d60c441ce2
fix incorrect retyping of "event_path" as "event, path" (i wasn't paying enough
...
attention)
2018-12-05 15:23:40 +00:00
jesopo
4015275afc
Add missing ")" from last commit
2018-12-05 15:19:58 +00:00
jesopo
df624e7e29
Don't do unnecessary work when someone tries to call a not-hooked-in-to event
2018-12-05 15:18:40 +00:00
jesopo
50149523dd
re-add check in utils.irc.parse_line that prevents us having an empty string as
...
an arg when there's no non-arbitrary args
2018-12-03 18:25:57 +00:00
jesopo
9dd9111f85
Further clarification of type hints in ModuleManager.py, including now making it
...
explicit that module objects MUST inherit from BaseModule
2018-12-02 16:00:55 +00:00
jesopo
9466f57efc
Use getattr
to get Module
classes out of modules in ModuleManager.py; this
...
makes more sense and removes some errors from type linting
2018-12-02 10:14:18 +00:00
jesopo
50ced296d1
Clarify func_queue type (IRCBot.py)
2018-12-02 10:08:58 +00:00
jesopo
10f84f970d
Clarify/fix type hints throughout EventManager.py
2018-12-02 10:04:05 +00:00
jesopo
08bd31f150
A couple of tweaks to clarify some type hints
2018-12-02 09:56:57 +00:00
jesopo
c4ea6fa562
data
is now line
2018-12-02 09:48:06 +00:00
jesopo
cbc3ae3432
Remove usage of sys.stderr in IRCBot.py, change disconnect logs from info
to
...
`warn`
2018-12-02 09:43:57 +00:00
jesopo
9a311c88b6
Remove print
calls from IRCBot.py, move received data logging to IRCServer
2018-12-02 09:41:21 +00:00
jesopo
eb0c13971a
Omit Config keys that have falsey values (empty)
2018-12-02 08:28:59 +00:00
jesopo
cdfe6d2959
'uderline' -> 'underline' typo in utils.irc
2018-11-30 16:32:18 +00:00
jesopo
4dfb2ffeaa
Support ANSI underline
2018-11-30 16:30:56 +00:00
jesopo
af0fddf9ba
'find_*_setting' functions don't exist anymore!
2018-11-28 10:12:17 +00:00
jesopo
e1cdd4a353
Add type hint for return type of IRCBot.trigger
2018-11-27 17:29:38 +00:00
jesopo
9d9deb28b5
Raise exceptions back up through .trigger()
2018-11-27 15:06:10 +00:00
jesopo
d13a5069e3
Grab response from functions asked to be executed on the main thread and feed
...
them back to the callers, allowing rest_api.py to take the main thread while
it's waiting for the response to give back to the requesting client
2018-11-27 14:25:12 +00:00
jesopo
7c4b2b6c4e
Add .nickname/.username/.realname/.hostname to IRCServer
2018-11-27 12:16:36 +00:00
jesopo
72dca06626
Add a way to catch when a writebuffer is emptied so we can e.g. assure a QUIT is
...
sent before shutting down the bot
2018-11-27 11:56:03 +00:00
jesopo
dce050aac5
Convert BOOLEAN sqlite3 types to bool objects when retrieving them
2018-11-27 11:39:50 +00:00
jesopo
fba1dd2271
Nope, just combine previous color-char and current color-char and see if it's
...
less than or equal to 15 (utils.irc)
2018-11-26 17:34:27 +00:00
jesopo
9a614846b0
Don't reject 6-9 (inclusive) when it's prepended by 0 (src/utils/irc.py)
2018-11-26 17:31:56 +00:00
jesopo
f93e3f927f
If a color code is double-digit, make sure it's 0-15, not just 0-20
2018-11-26 17:23:11 +00:00
jesopo
8d32fed2fe
ModuleWarnings in src/ModuleManger.py should be logged as warn
, not error
2018-11-26 14:42:41 +00:00
jesopo
1b03d31c6b
Switch back to logging events as 2 messages as a lot of other logs can happen
...
between the start and end of an event and grouping them together is very useful
2018-11-26 14:23:20 +00:00
jesopo
6d6bfa3262
Don't assume a given mode is in IRCChannel.modes when we check to see if a given
...
mode has any arguments against it
2018-11-26 13:39:26 +00:00
jesopo
8cd069d37d
'bot.log' -> 'trace.log' and add a 'warn.log' log file that only catches
...
warn-and-worse
2018-11-26 11:09:43 +00:00
jesopo
5b70f37796
also support zero-padded color codes
2018-11-25 13:32:57 +00:00
jesopo
6d2c15ed2c
Don't eat numbers after color formatting if they'd end up making the color code
...
`20` or more
2018-11-25 13:23:00 +00:00
Evelyn
8cd7393d17
Regression: Don't connnect if a server's 'connect' setting is false
2018-11-24 12:14:36 +00:00
jesopo
d606944648
Move self.name = self.nickname_lower
to under setting self.nickname_lower
,
...
otherwise `self.name` will be `""`
2018-11-23 13:55:40 +00:00
jesopo
3061c65024
IRCServer.Server.get_user
should be 'typing.Optional[IRCUser.User]', not just
...
'IRCUser.user'
2018-11-21 20:18:12 +00:00
jesopo
5001e47af9
typo in src/IRCServer.py, 'typing.float' -> 'float'
2018-11-21 20:17:02 +00:00
jesopo
9ecbb6be7b
Fix mypy issues caused by overwriting a bytes
variable with a str
object
2018-11-21 20:16:07 +00:00
jesopo
bab4fca287
Add more return type annotations to src/IRCServer.Server
2018-11-21 20:13:56 +00:00
jesopo
9a5ba99840
Add some missing return type annotations in src/IRCServer.Server
2018-11-21 20:05:21 +00:00
jesopo
2852afd5f7
Add IRCServer.Server.get_target, to get an IRCChannel if the given target is a
...
channel name or an IRCUser
2018-11-21 20:04:07 +00:00
jesopo
60acf02cee
prefix
should be a Optional[IRCHostmask], we shouldn't use Optional[]
as a
...
compile-time object (utils.irc)
2018-11-20 17:23:47 +00:00
jesopo
549c12da10
Clarify typing in src/IRCChannel.py
2018-11-20 14:08:36 +00:00
jesopo
5d813175a1
Don't enable write throttling until we get 005
2018-11-19 10:12:52 +00:00
jesopo
f46015d9d8
Minor code styling change in urils.irc
2018-11-17 12:48:56 +00:00
jesopo
756c543c32
Typo in utils.__init__, 'number' -> 'number_str'
2018-11-16 17:45:40 +00:00
jesopo
8300c84f6a
Log event timing in 1 message, not 2
2018-11-14 23:08:39 +00:00
jesopo
ae8aeaeef4
Typo in src/Database.py, 'total_millisecons' -> 'total_milliseconds'
2018-11-14 23:06:41 +00:00
jesopo
1ec6d0ad40
Log query timing in src/Database.py in 1 line, not 2
2018-11-14 23:04:54 +00:00
jesopo
1297901dca
We do indeed need to see "\x03" even when there's no foreground/background
...
(color reset)
2018-11-14 22:50:04 +00:00
jesopo
2fc948ab24
Don't eat commas when there's no background color or when a comma directly
...
follows a background color
2018-11-14 22:35:13 +00:00
jesopo
81e1f11872
Missed a 'message' -> 'ctcp_message'
2018-11-14 22:13:31 +00:00
jesopo
1380f6c534
Typo in utils.irc, 'message' -> 'ctcp_message'
2018-11-14 22:10:45 +00:00
jesopo
19b195eb1d
Stop supporting using ansi bold for brightening colors, support ansi background
...
colors
2018-11-14 22:07:34 +00:00
jesopo
378f4b1f93
Better parsing of CTCP messages, support raw.send.privmsg/raw.send.notice in
...
modules/line_handler.py
2018-11-14 21:28:27 +00:00
jesopo
ed838193aa
Better support passing "send" events through the parsers already present in
...
modules/line_handler.py
2018-11-14 14:41:28 +00:00
jesopo
f7872fac43
Typo in src/utils/irc.py, 'resplace' -> 'replace'
2018-11-14 13:16:11 +00:00
jesopo
99c2147512
Don't assume a reconnect timer event will always have connection_params
2018-11-14 13:08:57 +00:00
jesopo
76d9face44
You can join color and bold in to one \033 ansi sequence
2018-11-14 12:19:31 +00:00
jesopo
0e499a4078
Support irc format full reset (\x0F) as ansi reset (\033[0m)
2018-11-14 12:13:08 +00:00
jesopo
bbcde2d1d5
Use extended ANSI colors to avoid using bold to make colors lighter
2018-11-14 11:47:15 +00:00
jesopo
2fcde64bfd
'ANSI_RESET' -> 'ANSI_BOLD_RESET' typo, 'ansi_bold' -> 'color_bold'
...
clarification, fix issue in color tokenizing that caused bolds to be put in the
wrong place
2018-11-14 11:44:56 +00:00
jesopo
bcdbb3640c
Add type annotions to irc->ansi color functions
2018-11-14 10:28:38 +00:00
jesopo
00eb4027ec
Only reset ansi bolding when both color-bold and bold are false
2018-11-14 08:09:01 +00:00
jesopo
e5f068f660
Bold reset is 22, not 21
2018-11-13 18:19:37 +00:00
jesopo
5c6aa87470
Fix bolding/unbolding code in utils.irc
2018-11-13 18:05:25 +00:00
jesopo
d18d28f0a2
Apparently '39' is 'font reset' for ansi colors
2018-11-13 17:53:37 +00:00
jesopo
f1b54efe77
Visual tweak; align "="s in utils.consts
2018-11-13 17:43:00 +00:00
jesopo
765ae0fcf9
Add code to tokenize and ansi-replace IRC colors; use this in
...
modules/print_activity.py
2018-11-13 17:23:28 +00:00
jesopo
7918f9cc4e
Better constifying of COLORs
2018-11-13 17:23:18 +00:00
jesopo
8b9062b942
Better constifying of color/font chars
2018-11-13 16:02:26 +00:00
jesopo
16c4e1bfc6
I was accidentally removing two characters from the start of :nick!user@host
2018-11-13 15:04:11 +00:00
jesopo
555e8faa03
Print MOTD in modules/print_activity.py (after caching it in
...
modules/line_handler.py)
2018-11-13 14:59:47 +00:00
jesopo
e9c9ec778c
Add .keys()/.values()/.items to src/IRCChannels.py
2018-11-13 11:36:44 +00:00
jesopo
36048be2fb
That shouldn't be there
2018-11-13 11:36:28 +00:00
jesopo
66643a1bd8
Return new user's id in Database.users.add
2018-11-13 11:19:43 +00:00
jesopo
8fc7a7652a
Return new server_id from Database.servers.add
2018-11-13 11:13:04 +00:00
jesopo
73c0c911d4
Move logic for adding a server to the database out to utils.cli and add a
...
--add-server flag for start.py, to add new server
2018-11-13 10:40:49 +00:00
jesopo
20b1e8b800
Remove unneeded const
2018-11-12 17:14:38 +00:00
jesopo
2747999ca6
We don't need utils.irc.remove_colon anymore!
2018-11-12 17:13:49 +00:00
jesopo
8b135d8310
Add type annotionations to src/Timers.py and src/IRCBuffer.py
2018-11-11 19:12:59 +00:00
jesopo
db1e2ea406
Add missing imports and Channel
namespacing to src/IRCChannel.py
2018-11-11 16:11:45 +00:00
jesopo
a9b6086c70
Split out Channels in to IRCChannels.Channels, not IRCChannel.Channels
2018-11-11 14:53:16 +00:00
jesopo
0f53d2e828
Fix type annotations for utils.parse.keyvalue
2018-11-11 14:43:31 +00:00
jesopo
6bb03c4519
Don't implicitly create channels, explicitly create channels when we join one
2018-11-11 13:03:54 +00:00
jesopo
e29cc1c52c
Implement __len__
on src/IRCChannel.py.Channels
2018-11-11 12:52:30 +00:00
jesopo
4e06a52bd9
Copypaste fail in src/IRCChannel.py, 'self.id' -> 'self._server.id'
2018-11-11 12:49:34 +00:00
jesopo
f6a997e3b9
Copypaste fail in src/IRCChannel.py, 'self.bot' -> 'self._bot'
2018-11-11 12:48:30 +00:00
jesopo
e133401ed9
Copypaste fail in src/IRCChannel, 'get_channel_id' -> '_get_id'
2018-11-11 12:47:02 +00:00
jesopo
32dccc65e0
Typin in src/IRCChannel.py, 'self._add' -> 'self.add'
2018-11-11 12:46:14 +00:00
jesopo
8eef9a612d
Readd line I accidentally removed in src/Database.py
2018-11-11 12:45:10 +00:00
jesopo
245c4599dd
Typo in src/IRCChannel.py, 'Iterable' -> 'typing.Iterable'
2018-11-11 12:43:39 +00:00
jesopo
0248c7503a
Forgot to import EventManager
in src/IRCChannel.py
2018-11-11 12:43:11 +00:00
jesopo
44393a3170
Add missing ":" in src/IRCChannel.py
2018-11-11 12:41:31 +00:00
jesopo
c84205ed9b
Add a threading.Lock()
around cursor.execute(...)
in Database.py
2018-11-11 12:40:24 +00:00
jesopo
2816fe67bb
Move channel tracking data/functions to src/IRCChannel.Channels
2018-11-11 12:34:22 +00:00
jesopo
4bab1aea30
Add a way to more explicitly denote when a CAP handshake has ended early
2018-11-09 10:43:05 +00:00
jesopo
a2292eb439
Filter out empty items in utils.parse.keyvalue
2018-11-08 22:41:30 +00:00
jesopo
3ff68dc427
Support passing unrestricted args between connections
2018-11-08 17:09:07 +00:00
jesopo
6bf6905262
Keep a track of bytes written and read per server
2018-11-08 13:31:05 +00:00
jesopo
26a16a7762
Keep a dict of isupport key:values on IRCServer.Server
2018-11-08 12:34:30 +00:00
jesopo
03cae696c1
Technically, we only need to unescape non-json message-tag *values*
2018-11-08 11:52:53 +00:00
jesopo
0c6d54f5fd
Only mesage-tag unescape non-json tags after we split on ";"
2018-11-08 11:43:32 +00:00
jesopo
729d1424ed
Unescape message-tags as per spec Escaping Rules
2018-11-08 11:37:23 +00:00
jesopo
5e7b335d04
Fix issues that were introduced in message-tag parsing when I added support for
...
JSON message tags
2018-11-08 11:13:24 +00:00
jesopo
3d00a1e15a
Explicitly denote when an :arbitrary arg is present in an IRCLine
2018-11-08 10:36:40 +00:00
jesopo
dccb460e5c
'rename_channel' -> 'rename' in src/Database.channels
2018-11-05 21:39:00 +00:00
jesopo
0a70fda6dc
Don't pass connection_params through to reconnect in normal circumstances
2018-11-05 20:51:51 +00:00
jesopo
ce3b319bee
Only automatically reconnect to a server when we don't already have a server
...
with the same ID (to make reconnection work)
2018-11-05 20:33:45 +00:00
jesopo
3cb9baeec3
Cache a server fileno from connect onwards, like we used to
2018-11-05 20:33:30 +00:00
jesopo
e2c806ffe4
Typo in IRCServer, 'nicknamme' -> 'nickname'
2018-11-05 20:18:22 +00:00
jesopo
9571c3f9fa
Update IRCServer.__repr__ to use connection_params
2018-11-05 20:18:06 +00:00
jesopo
afce01d0f8
Fall back to nickname for username/realname, as it used to be
2018-11-05 20:08:55 +00:00
jesopo
8b1e1fbb2e
Clarify typing of .nickname/.nickname_lower/.name in IRCUser
2018-11-05 18:37:15 +00:00
jesopo
d63115440d
Fix the order of some connection params, add alias
as a seperate argument to
...
IRCServer.Server
2018-11-05 18:30:39 +00:00
jesopo
6b8593a09b
Pass connection parameters around in their own object (IRCConnectionParameters)
2018-11-05 18:23:02 +00:00
jesopo
d92fc7f6b8
Add missing import of json in utils.irc
2018-11-05 17:44:21 +00:00
jesopo
0676b7b0db
Call Database.channels.rename in IRCServer.Server.rename_channel
2018-11-05 16:47:47 +00:00
jesopo
055390e220
Add Database.channels.rename, as part of support for IRCv3's RENAME
2018-11-05 16:46:24 +00:00
jesopo
4936b91273
Support JSON messages tags, as per IRCv'3 message-tags-0.3 #318 pull request
2018-11-05 15:15:08 +00:00
jesopo
aaf0c8cf2a
Reschedule STS expiration on disconnect
2018-11-05 14:12:21 +00:00
jesopo
6ca8017966
Give Logging.Log object to modules
2018-11-05 12:38:40 +00:00
jesopo
10130d7288
I forgot the "normal" event hook syntax!
2018-11-05 12:34:18 +00:00
jesopo
86bbd370fb
'self.events' -> 'self._events' in IRCBot
2018-11-05 12:29:13 +00:00
jesopo
c3f654673a
Cache socket fileno in IRCServer.Server just before disconnecting
2018-11-05 12:27:30 +00:00
jesopo
fa3fc7e3fb
@utils.hook doesn't work outside of modules!
2018-11-05 12:27:11 +00:00
jesopo
fcedc434f2
it should be self.bindhost, now that we've moved the logic to .connect() instead
...
of __init__
2018-11-05 12:18:30 +00:00
jesopo
1065bba3ef
Typo in src/IRCServer.py; 'self.AF_INET' -> 'socket.AF_INET'
2018-11-05 12:16:30 +00:00
jesopo
7cc6b559be
Clarify items
and var_items
typing in src.utils.parse
2018-11-05 11:56:52 +00:00
jesopo
9c233cd4dd
Add src.utils.parse.keyvalue, mostly for IRCv3 CAP negotiation
2018-11-05 11:56:28 +00:00
jesopo
c2ebc7b5e4
Refactor IRCServer .connect() logic
2018-11-05 11:53:33 +00:00
jesopo
66ee3ce5f1
Add __repr__ to utils.irc.IRCArgs
2018-11-05 10:03:20 +00:00
jesopo
c1e9825a33
Don't set args
to a split of the data left over when parsing out a command if
...
there's not a space after the command
2018-11-04 17:23:34 +00:00
jesopo
1610cfb499
Implement utils.irc.IRCArgs.__len__
2018-11-04 17:06:50 +00:00
jesopo
b8e3cdb075
Fix typo in utils.irc, 'self_args' -> 'self._args'
2018-11-04 17:04:16 +00:00
jesopo
52aa8a51a6
Move definition of IRCArgs above IRCLine
2018-11-04 17:03:01 +00:00
jesopo
e1d261bda0
Fix typo in utils.irc
2018-11-04 17:01:50 +00:00
jesopo
58363895f1
Change line parsing to put arbitrary-length args on the end of
...
`args` so we can get rid of `last`/`arbitrary` and add IRCArgs (with .get())
to help only getting an arg index if it exists
2018-11-04 15:37:06 +00:00
jesopo
6d742f6a74
Implement IRCv3's draft/rename
2018-11-04 14:48:55 +00:00
jesopo
9fe7815c17
utils.irc.color should take int
for foreground/background, not str
2018-11-02 13:14:42 +00:00
jesopo
5b27ccb551
Add src/__init__.py to allow mypy to see src/ as a module
2018-11-02 11:51:13 +00:00
jesopo
a4d8d1f855
Fix some non-explicit None returns, add type hints to important variables
2018-10-31 15:12:46 +00:00
jesopo
7d54bd6ad0
Move setting BitBotFormatter's converter (to time.gmtime) to class definition as
...
it's not technically correct to overwrite a funcion on an existing object
2018-10-30 18:03:44 +00:00
jesopo
b543e31cd2
Fix/refactor issues brought up by type hint linting
2018-10-30 17:49:35 +00:00
jesopo
d0e3574227
Typo in src/Exports; 'self_exports' -> 'self.exports'
2018-10-30 16:28:39 +00:00
jesopo
e07553c362
Add type/return hints throughout src/ and, in doing so, fix some cyclical
...
references.
2018-10-30 14:58:48 +00:00
jesopo
50e7aa40b9
Typo in utils.parse_docstring, 'multiple_items' -> 'var_items'
2018-10-28 11:53:44 +00:00
jesopo
857761a653
Support multiple items for docstring kwargs in utils.parse_docstring
2018-10-28 11:43:41 +00:00
jesopo
3094bb7748
Specifically handle OSError (e.g. Network is unreachable) as a disconnect
2018-10-26 11:30:16 +01:00
jesopo
d3231e3282
signal.signal timer callback takes 2 args
2018-10-25 14:09:19 +01:00
jesopo
4d3ff60205
Update src/IRCUser.py.send_notice to take a prefix kwarg
2018-10-25 12:15:12 +01:00
jesopo
8ea6db9422
Standardise "Failed to load results" errors!
2018-10-20 20:53:24 +01:00
jesopo
6bcfcb60ea
Some networks allow you to remove user modes that don't exist e.g. removing +o
...
from someone that doesn't have it. wtf.
2018-10-18 21:07:08 +01:00
jesopo
751aaa3365
Add missing return
in src/IRCServer.py.get_user_setting
2018-10-18 17:16:23 +01:00
jesopo
4796d4264c
Print lines not [lines] in src/IRCBot.py
2018-10-17 17:36:01 +01:00
jesopo
c48574a3d6
"Cannot" -> "can't" in IRCServer encoding fallback
2018-10-17 17:04:56 +01:00
jesopo
a4bfae9557
TRACE log when we have to use fallback encoding
2018-10-17 16:54:33 +01:00
jesopo
6c6d593e6d
Only log exceptions when they're not unsafe
2018-10-16 14:53:37 +01:00
jesopo
ba3cd00c78
Add utils.EventError, utilise it for stderr in commands.py/coins.py
2018-10-16 14:47:01 +01:00
jesopo
743b3bc754
event["args"] is an array already, args_split does not exist. Also send raw
...
events from src/IRCServer.py as call_unsafe to make errors like that more
apparent.
2018-10-15 14:29:16 +01:00
jesopo
40ffb6ce0e
Typo in src/IRCServer.py, 'defau;t' -> 'default'
2018-10-14 14:31:30 +01:00
jesopo
0ed0b235e9
Work directly from users in modules/coins.py.interest(), so as to not give
...
double-interest to two "users" online at the same time sharing the same identity
2018-10-14 14:30:19 +01:00
jesopo
43d026cc9d
Typo in src/Timers.py, 'conteext' -> 'context'
2018-10-13 09:16:53 +01:00
jesopo
5e3399f73e
Actually, don't give contexts to timers that aren't contextual. (e.g. pesistent
...
timers)
2018-10-13 09:10:26 +01:00