degesch: better message autosplit
This commit is contained in:
		
							parent
							
								
									53b46482f5
								
							
						
					
					
						commit
						2633eda69a
					
				
							
								
								
									
										56
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								degesch.c
									
									
									
									
									
								
							| @ -2722,27 +2722,57 @@ send_message_to_target (struct app_context *ctx, | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	int one_message = 0; | ||||
| 	// We don't always have the full info for message splitting
 | ||||
| 	int space_in_one_message = 0; | ||||
| 	if (ctx->irc_user_host) | ||||
| 		// :<nick>!<user>@<host> PRIVMSG <target> :<message>
 | ||||
| 		one_message = 510 - 1 - (int) strlen (ctx->irc_user->nickname) | ||||
| 		space_in_one_message = 510 | ||||
| 			- 1 - (int) strlen (ctx->irc_user->nickname) | ||||
| 			- 1 - (int) strlen (ctx->irc_user_host) | ||||
| 			- 1 - 7 - 1 - strlen (target) - 1 - 1; | ||||
| 
 | ||||
| 	// FIXME: UTF-8 sequences
 | ||||
| 	int left = strlen (message); | ||||
| 	while (left) | ||||
| 	// Attempt to split the message if it doesn't completely fit into
 | ||||
| 	// a single IRC protocol message while trying not to break UTF-8.
 | ||||
| 	// Unicode can still end up being wrong, though.
 | ||||
| 	// TODO: at least try to word-wrap if nothing else
 | ||||
| 	for (int message_left = strlen (message); message_left; ) | ||||
| 	{ | ||||
| 		int part = MIN (one_message, left); | ||||
| 		if (!one_message) | ||||
| 			part = left; | ||||
| 		struct str m; | ||||
| 		str_init (&m); | ||||
| 
 | ||||
| 		irc_send (ctx, "PRIVMSG %s :%.*s", target, part, message); | ||||
| 		int part_left = MIN (space_in_one_message, message_left); | ||||
| 		if (!space_in_one_message) | ||||
| 			part_left = message_left; | ||||
| 
 | ||||
| 		bool empty = true; | ||||
| 		while (true) | ||||
| 		{ | ||||
| 			const char *next = utf8_next (message, message_left); | ||||
| 			hard_assert (next); | ||||
| 
 | ||||
| 			int char_len = message - next; | ||||
| 			if (char_len > part_left) | ||||
| 				break; | ||||
| 
 | ||||
| 			str_append_data (&m, message, char_len); | ||||
| 
 | ||||
| 			message += char_len; | ||||
| 			message_left -= char_len; | ||||
| 			empty = false; | ||||
| 		} | ||||
| 		if (empty) | ||||
| 		{ | ||||
| 			// Well, that's just weird
 | ||||
| 			buffer_send_error (ctx, buffer, "%s", | ||||
| 				"Message splitting was unsuccessful as there was " | ||||
| 				"too little room for UTF-8 characters"); | ||||
| 			message_left = 0; | ||||
| 		} | ||||
| 
 | ||||
| 		irc_send (ctx, "PRIVMSG %s :%s", target, m.str); | ||||
| 		buffer_send (ctx, buffer, BUFFER_LINE_PRIVMSG, 0, | ||||
| 			ctx->irc_user->nickname, NULL, "%.*s", part, message); | ||||
| 
 | ||||
| 		left -= part; | ||||
| 		message += part; | ||||
| 			ctx->irc_user->nickname, NULL, "%s", m.str); | ||||
| 		str_free (&m); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user