Implement message splitting
This commit is contained in:
		
							parent
							
								
									be4283b8ff
								
							
						
					
					
						commit
						3bb3a11454
					
				
							
								
								
									
										43
									
								
								command.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								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(¶ms[len], 1 + strlen(¶ms[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(¶ms, " ")); | ||||
| 	echoMessage("PRIVMSG", id, params); | ||||
| 	splitMessage("PRIVMSG", id, params); | ||||
| } | ||||
| 
 | ||||
| static void commandJoin(uint id, char *params) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user