* lisp/net/rcirc.el (rcirc-split-message): New function.
authorLeo Liu <sdl.web@gmail.com>
Mon, 13 Aug 2012 17:22:42 +0000 (01:22 +0800)
committerLeo Liu <sdl.web@gmail.com>
Mon, 13 Aug 2012 17:22:42 +0000 (01:22 +0800)
(rcirc-send-message): Use it.

Fixes: debbugs:12051

lisp/ChangeLog
lisp/net/rcirc.el

index 6501738..4e03a56 100644 (file)
@@ -1,3 +1,8 @@
+2012-08-13  Leo Liu  <sdl.web@gmail.com>
+
+       * net/rcirc.el (rcirc-split-message): New function.
+       (rcirc-send-message): Use it.  (Bug#12051)
+
 2012-08-10  Glenn Morris  <rgm@gnu.org>
 
        * emacs-lisp/copyright.el (copyright-update-directory): Logic fix.
index e34b7c7..0eb6c7e 100644 (file)
@@ -794,26 +794,35 @@ With no argument or nil as argument, use the current buffer."
 (defvar rcirc-max-message-length 420
   "Messages longer than this value will be split.")
 
+(defun rcirc-split-message (message)
+  "Split MESSAGE into chunks within `rcirc-max-message-length'."
+  (with-temp-buffer
+    (insert message)
+    (goto-char (point-min))
+    (let (result)
+      (while (not (eobp))
+       (goto-char (or (byte-to-position rcirc-max-message-length)
+                      (point-max)))
+       ;; max message length is 512 including CRLF
+       (while (and (not (bobp))
+                   (> (length
+                       (encode-coding-region (point-min) (point)
+                                             rcirc-encode-coding-system t))
+                      rcirc-max-message-length))
+         (forward-char -1))
+       (push (delete-and-extract-region (point-min) (point)) result))
+      (nreverse result))))
+
 (defun rcirc-send-message (process target message &optional noticep silent)
   "Send TARGET associated with PROCESS a privmsg with text MESSAGE.
 If NOTICEP is non-nil, send a notice instead of privmsg.
 If SILENT is non-nil, do not print the message in any irc buffer."
-  ;; max message length is 512 including CRLF
-  (let* ((response (if noticep "NOTICE" "PRIVMSG"))
-         (oversize (> (length message) rcirc-max-message-length))
-         (text (if oversize
-                   (substring message 0 rcirc-max-message-length)
-                 message))
-         (text (if (string= text "")
-                   " "
-                 text))
-         (more (if oversize
-                   (substring message rcirc-max-message-length))))
+  (let ((response (if noticep "NOTICE" "PRIVMSG")))
     (rcirc-get-buffer-create process target)
-    (rcirc-send-string process (concat response " " target " :" text))
-    (unless silent
-      (rcirc-print process (rcirc-nick process) response target text))
-    (when more (rcirc-send-message process target more noticep))))
+    (dolist (msg (rcirc-split-message message))
+      (rcirc-send-string process (concat response " " target " :" msg))
+      (unless silent
+       (rcirc-print process (rcirc-nick process) response target msg)))))
 
 (defvar rcirc-input-ring nil)
 (defvar rcirc-input-ring-index 0)