+2007-04-12 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+
+ * Basic class extensions: Module#define_structure() method. Syntax:
+ define_structure :SomeName, :attr_a, :attr_b
+ is equivalent to
+ SomeName = Struct.new("SomeName", :attr_a, :attr_b)
+ except that the new Struct is not created if it already exists and the
+ attributes list is the same.
+
+2007-03-31 Dmitry Kim <dmitry.kim@gmail.com>
+
+ * HttpUtil: major rework. get_response() method now respects
+ caching (can be turned off via options) and supports different HTTP
+ methods (GET (default), HEAD and POST) and ranged requests. get() and
+ head() methods are now just a thin wrappers around get_request().
+ Semantics for user-supplied &block has been made consistent across
+ these methods.
+ * HttpUtil: get_cached() method has been removed (obsoleted by new
+ get()). post() method has been added. get_partial() method for ranged
+ requests has been added. Net::HTTPResponse partial_body() method has
+ been removed (mostly because it won't play well with future HTTP
+ encodings support), please use get_partial() or get_request() instead.
+ * Utils: http_get() method has been removed (long obsoleted by
+ HttpUtil)
+ * different plugins: modified to accomodate for HttpUtil changes.
+
+2007-03-24 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+
+ * HttpUtil: new get_response method to follow redirects and get an
+ Net::HTTPResponse object with an open connection, allowing partial
+ body retrieval.
+ * HttpUtil: extend Net::HTTPResponse with a #partial_body() method. The
+ method take an argument (max bytes to download) and an optional block;
+ the method yields all the partial content that it's being downloaded,
+ instead of the single chunks yield by #read_body().
+ * url plugin: use the new HttpUtil methods.
+ * url plugin: do not block while trying to get link info.
+
+2007-03-14 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+
+ * Socket filtering: socket data, both input and output, can now be
+ filtered. This is used for example to transcode all input and output
+ so that messages are internally managed as UTF-8. By default, the bot
+ will try cp1252 (Windows Western European) encoding for non-UTF-8
+ strings. Thanks to jsn (Dmitry Kim <dmitry.kim@gmail.com>).
+
+2007-03-10 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
+
+ * IRC settings: ability to change the IRC name for the bot. Thanks to
+ jsn (Dmitry Kim <dmitry.kim@gmail.com>).
+ * Plugin: allow customization of the plugin load path. Thanks to
+ jsn (Dmitry Kim <dmitry.kim@gmail.com>).
+
2007-02-20 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
* Timers: failing timer actions don't prevent the global timer ticker
<yaohan.chen@gmail.com>. People take turns to continue a chain of
words by saying words that begin with the final letter(s) of the
previous word.
+ * IRC messages are not UTF-8: Most of the string processing across
+ rbot is done against IRC messages, which do not have a well-defined
+ encoding. Although many clients are now using UTF-8, there is no
+ guarantee that an arbitrary string received from IRC will be UTF-8
+ encoded. We have to force ASCII (byte-wise/charset agnostic) matching
+ because otherwise some strings can give problems: in particular, for
+ example, the bytesequence "\340\350\354\362\371" (that is the aeiou
+ vowels, each with a grave accent) will cause the string to be
+ considered up to the "\354" (i with grave accent) only: so either the
+ rest of the message is ignored, or the matching fails.
2007-02-18 Giuseppe Bilotta <giuseppe.bilotta@gmail.com>