Default mIRC colors are 0-15, and some clients don't react too well to a
color > 15, while most wrap or default. Konversation, for example, will
stop the color command parsing and interpret it as color 1, followed by
the literal digit 6.
So use the 'official' (mIRC) value of 0 for white.
Giuseppe Bilotta [Thu, 25 Nov 2010 16:53:57 +0000 (17:53 +0100)]
rss: watch handle case during rename
We allow rss handles to be of any case on creation, even though matching
is case-insentivie. However, when renaming an rss using 'rss change
handle' and only changing the case, two things prevented this from
working correctly:
* since the new downcased handle was equal to the old downcased handle,
the bot would prevent the renaming due to the existence of the new
handle
* the new handle was forcefully downcased, preventing the user
from renaming handle 'case' to 'CaSe'.
Fix by checking for this case explicitly, and handling it separately.
Giuseppe Bilotta [Thu, 25 Nov 2010 12:49:15 +0000 (13:49 +0100)]
remind: fix presence of 'in', 'every' or 'at' in message
if 'in' was present in the message but not part of the time
specification (e.g. because the specification was with 'every' or with
'at'), the parser would fail at the first attempt (look for time after
'in') and fail unnecessarily.
Fix by trying all possibilities and only giving an error if none
succeeds.
Giuseppe Bilotta [Thu, 18 Nov 2010 15:08:19 +0000 (16:08 +0100)]
rss plugin: don't fail when feed.last_success is nil
The first_run check comparing the time delta from last success failed
when feed.last_success was nil. Prevent this from happening by checking
if we are on the first run before the rest of the checks.
Commit a306b2c68eb58c1c88057ff7ee78895401adb6a9 introduced a fix to
prevent a player from playing something like g9r9, but the fix actually
prevented any single-card play. Fix by making the \1 optional.
Giuseppe Bilotta [Mon, 18 Oct 2010 22:39:13 +0000 (00:39 +0200)]
uno plugin: don't allow g9r9 card specification
The regexp should make sure that the second card is equal to the first
specified card, instead of matching the card expression one or two
times. Otherwise, a play like 'pl g9r9' would be accepted when the
player had two r9 cards and could play them.
This is only a aesthetical change because the plays would still be
valid, albeit (1) surprising and (2) mismatching what the user actually
wrote.
Giuseppe Bilotta [Thu, 14 Oct 2010 08:35:26 +0000 (10:35 +0200)]
safe_exec fixes
Some plugins (ri, fortune) wrap safe_exec in begin/rescue blocks that
did not get triggered because the exceptions from the execution were
caught in the popen block (and would never get exposed anyway). Fix this
by raising if $? does not indicate success.
Giuseppe Bilotta [Thu, 14 Oct 2010 08:15:47 +0000 (10:15 +0200)]
dictclient: monkeypatch DICTError
The Ruby/DICT library is so tightly coupled with the rdict client that
its errors exit on initialize, instead of letting the lib user do that.
This makes those errors untrappable from the code.
Fix by monkeypatching DICTError to just act like the other exceptions in
Ruby.
Convert the (optional) first argument to #each*() methods to a string to
ensure the calls work as expected. This fixes a problem with
@registry.each not working as expected, and although it would have been
sufficient to convert the default for the first argument from nil to the
empty string, the approach implemented by this patch is more robust
overall.
Giuseppe Bilotta [Thu, 30 Sep 2010 10:08:34 +0000 (12:08 +0200)]
Revert "markov: removed unnecessary mutexes"
This reverts commit 06485aeb187dde5e81204b06c8e956e7e035c323. The mutex
is necessary because of the concurrent learning and database conversion.
Some other approach should be used instead (e.g. skipping the mutex if
not running a conversion).
Giuseppe Bilotta [Wed, 29 Sep 2010 23:37:05 +0000 (01:37 +0200)]
IRC framework: Server#to_s must always return a String
Having Server#to_s alias the hostname would cause problems when the
hostname was nil (e.g. after a disconnect). Fix by making sure that to_s
always returns a string instead.
Giuseppe Bilotta [Mon, 27 Sep 2010 11:52:14 +0000 (13:52 +0200)]
* wrap BDB::Fatal classes for abstract trapping
When using a DB backend different from BDB, the BDB constant may not be
defined, causing a NameError during error trapping in the main loop. Fix
this by defining our own DBFatal error that maps to BDB::Fatal in the
BDB case and is defined as an (unused) Exception for TokyoCabinet.
Giuseppe Bilotta [Thu, 23 Sep 2010 20:20:57 +0000 (22:20 +0200)]
TokyoCabinet: 0.9.5-to-0.9.9 must use BDB only
When upgrading from 0.9.5 data, write the 0.9.9-style regisitry using
BDB still rather than trying to use TokyoCabinet already. This makes
sure that the next step (0.9.9 to modern times) works correctly.
(Moreover, the existing BDB-to-TC attempt wouldn't have worked anyway
due to wrong var names. I doubt anybody will ever hit this path and
notice though.)
Giuseppe Bilotta [Wed, 15 Sep 2010 12:09:42 +0000 (14:09 +0200)]
tumblr: support reblogging and fix HTML issues
Detect tumblr posts and use the reblogging API to post them. Also
produce HTML-escaped lines for video and photo captions because
the format=markdown specification doesn't seem to apply to them.
When OAuth is missing, some barebone functionality in the twitter plugin
is still available (namely, status reading from public timelines), so
don't fail loading and just warn the users and admins about the reduced
availability.
There was a bug in "twitter pin" functionality where it didn't
check to verify that the PIN entered by the user was valid. As
a result, if the user entered an invalid PIN, the bot would
not respond as to whether or not twitter account binding was
successful. I replaced it with an error message if the PIN
is invalid. I also changed the error message for someone
who tries to enter a PIN without first using "twitter
authorize" to be more clear.
Module now requires twitter.key and twitter.secret config parameters for
write access and private users' statuses. Added twitter authorize,
twitter deauthorize, and twitter pin features, removed twitter identify
feature, as basic authentication is no longer supported.
Atom categories don't have a content attribute, and obviously they don't
have an empty? method. Squash them to their label rather than bombing
out with error during the blank2nil processing.
Freshmeat now provides the news in XML form under /index.xml, which
provides more information, and in a more computer-friendly way. Use that
if possible (correctly-configured API token), fall back to RSS parsing
otherwise.
When a redirect has a Set-Cookie: header, check if the cookie domain is
valid for the host we are redirected to. If not, don't set the cookie
in the new request.
We sometimes skip releases for such a long time that we forget what
exactly we have to do, and in what order. Let's keep this list in view
and up-to-date
This allows lazy players to specify the color after playing the wild by
pressing up-arrow and adding the color to the previous line, without
running the risk of playing their precious second wild.
The public announcement is now a generic "can't do that", with the
specific message being notified to the user. This reduces the chance of
other players guessing what the current player has from the error
messages.
The old XML files are not accessible, sadly, and the new API requires an
auth token. But at least it works again. For updates, we use the RSS
feed, parsing it manually.
Define a rule in the Rakefile to generate them, and change the Dir[]
into a FileList[] into the gemspec. The latter change has the downside
of requiring Rake's FileList, but the upside of listing non-existing
files, so that Rake can create them, if possible, or complain if they
are just missing.