summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-03-22 15:13:33 -0400
committerJune McEnroe <june@causal.agency>2020-03-22 15:13:33 -0400
commit3bb3a114542d3ac661bc49bd00d296695d5a4979 (patch)
treee12be18080503a86ac812871a933f138219f72cf
parentHandle empty input directly in command (diff)
downloadcatgirl-3bb3a114542d3ac661bc49bd00d296695d5a4979.tar.gz
catgirl-3bb3a114542d3ac661bc49bd00d296695d5a4979.zip
Implement message splitting
-rw-r--r--command.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/command.c b/command.c
index e06c2a0..9341310 100644
--- a/command.c
+++ b/command.c
@@ -14,6 +14,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+#include <assert.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -52,12 +53,48 @@ static void echoMessage(char *cmd, uint id, char *params) {
 	handle(msg);
 }
 
+static void splitMessage(char *cmd, uint id, char *params) {
+	if (!params) return;
+	// FIXME: Get USERLEN, HOSTLEN from ISUPPORT and assume worst case if
+	// self.user and self.host are unset?
+	const char *nick = self.nick;
+	const char *user = (self.user ? self.user : "*");
+	const char *host = (self.host ? self.host : "*");
+	int overhead = snprintf(
+		NULL, 0, ":%s!%s@%s %s %s :\r\n",
+		nick, user, host, cmd, idNames[id]
+	);
+	assert(overhead > 0 && overhead < 512);
+	int chunk = 512 - overhead;
+	if (strlen(params) <= (size_t)chunk) {
+		echoMessage(cmd, id, params);
+		return;
+	}
+
+	while (*params) {
+		int len = 0;
+		for (int n = 0; len + n <= chunk; len += n) {
+			n = mblen(&params[len], 1 + strlen(&params[len]));
+			if (n < 0) {
+				n = 1;
+				mblen(NULL, 0);
+			}
+			if (!n) break;
+		}
+		char ch = params[len];
+		params[len] = '\0';
+		echoMessage(cmd, id, params);
+		params[len] = ch;
+		params += len;
+	}
+}
+
 static void commandPrivmsg(uint id, char *params) {
-	echoMessage("PRIVMSG", id, params);
+	splitMessage("PRIVMSG", id, params);
 }
 
 static void commandNotice(uint id, char *params) {
-	echoMessage("NOTICE", id, params);
+	splitMessage("NOTICE", id, params);
 }
 
 static void commandMe(uint id, char *params) {
@@ -68,7 +105,7 @@ static void commandMe(uint id, char *params) {
 
 static void commandMsg(uint id, char *params) {
 	id = idFor(strsep(&params, " "));
-	echoMessage("PRIVMSG", id, params);
+	splitMessage("PRIVMSG", id, params);
 }
 
 static void commandJoin(uint id, char *params) {
0a85ee9abe70d2e2c8af4eb0be368f4294&follow=1'>Add photos from September 22June McEnroe 2024-09-25Add photos from September 15June McEnroe 2024-09-24Add photos from September 14June McEnroe 2024-09-24Add photos from September 12June McEnroe 2024-09-24Add photos from September 7June McEnroe 2024-09-24Allow not having descriptionsJune McEnroe I'm sorry, I can't keep writing descriptions. It makes posting photos take too long, I often don't know the words for what I'm looking at, and a good description is an entirely different work of art than the photo I took, and I'm just a photographer. It's visual art. 2024-09-23Automatically select the last used lens for a bodyJune McEnroe 2024-09-19Add photos from September 5June McEnroe Had to prefix the folder number onto these file names manually because they must have come out of a different scanner or something. 2024-09-15Add some more film stocks to the listJune McEnroe 2024-09-13Add photos from September 2June McEnroe 2024-09-13Add Fomapan 200 to films listJune McEnroe 2024-09-10Add August 29 picnic photosJune McEnroe 2024-09-08Apply some bold to trips renderingJune McEnroe This seems easier to visually scan. The only other thing I'd like is a nicer date rendering but JavaScript is useless for that. 2024-09-08Render trips hopefully more efficientlyJune McEnroe 2024-09-08Allow removing bodies and lensesJune McEnroe 2024-09-08Limit body width so it looks less silly on desktopJune McEnroe 2024-09-07Handle no film being loadedJune McEnroe 2024-09-07Fancy up the text a littleJune McEnroe