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/>.
 | 
					 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
@ -52,12 +53,48 @@ static void echoMessage(char *cmd, uint id, char *params) {
 | 
				
			|||||||
	handle(msg);
 | 
						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) {
 | 
					static void commandPrivmsg(uint id, char *params) {
 | 
				
			||||||
	echoMessage("PRIVMSG", id, params);
 | 
						splitMessage("PRIVMSG", id, params);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void commandNotice(uint id, char *params) {
 | 
					static void commandNotice(uint id, char *params) {
 | 
				
			||||||
	echoMessage("NOTICE", id, params);
 | 
						splitMessage("NOTICE", id, params);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void commandMe(uint id, char *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) {
 | 
					static void commandMsg(uint id, char *params) {
 | 
				
			||||||
	id = idFor(strsep(¶ms, " "));
 | 
						id = idFor(strsep(¶ms, " "));
 | 
				
			||||||
	echoMessage("PRIVMSG", id, params);
 | 
						splitMessage("PRIVMSG", id, params);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void commandJoin(uint id, char *params) {
 | 
					static void commandJoin(uint id, char *params) {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user