diff options
Diffstat (limited to 'irc_send.c')
| -rw-r--r-- | irc_send.c | 78 | 
1 files changed, 67 insertions, 11 deletions
| @@ -44,7 +44,7 @@ void irc_send_login(irc_t *irc)  	             PACKAGE, BITLBEE_VERSION);  	irc_send_num(irc,   3, ":%s", IRCD_INFO);  	irc_send_num(irc,   4, "%s %s %s %s", irc->root->host, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES); -	irc_send_num(irc,   5, "PREFIX=(ohv)@%%+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d CHANNELLEN=%d " +	irc_send_num(irc,   5, "PREFIX=(qaohv)~&@%%+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d CHANNELLEN=%d "  	             "NETWORK=BitlBee SAFELIST CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 "  	             "FLOOD=0/9999 :are supported by this server",  	             CTYPES, CMODES, MAX_NICK_LENGTH - 1, MAX_NICK_LENGTH - 1); @@ -366,6 +366,11 @@ void irc_send_who(irc_t *irc, GSList *l, const char *channel)  void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix)  { +	irc_send_tagged_msg(iu, type, dst, msg, prefix, NULL); +} + +void irc_send_tagged_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix, const char *tags) +{  	char last = 0;  	const char *s = msg, *line = msg;  	char raw_msg[strlen(msg) + 1024]; @@ -385,14 +390,14 @@ void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char  				strcpy(raw_msg, "\001ACTION ");  				strncat(raw_msg, line + 4, s - line - 4);  				strcat(raw_msg, "\001"); -				irc_send_msg_raw(iu, type, dst, raw_msg); +				irc_send_tagged_msg_raw(iu, type, dst, raw_msg, tags);  			} else {  				*raw_msg = '\0';  				if (prefix && *prefix) {  					strcpy(raw_msg, prefix);  				}  				strncat(raw_msg, line, s - line); -				irc_send_msg_raw(iu, type, dst, raw_msg); +				irc_send_tagged_msg_raw(iu, type, dst, raw_msg, tags);  			}  			line = s + 1;  		} @@ -402,21 +407,56 @@ void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char  void irc_send_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg)  { -	irc_write(iu->irc, ":%s!%s@%s %s %s :%s", -	          iu->nick, iu->user, iu->host, type, dst, msg && *msg ? msg : " "); +	irc_send_tagged_msg_raw(iu, type, dst, msg, NULL); +} + +void irc_send_tagged_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *tags) +{ +	if (!tags || !*tags) { +		irc_write(iu->irc, ":%s!%s@%s %s %s :%s", +			  iu->nick, iu->user, iu->host, +			  type, dst, msg && *msg ? msg : " "); +	} else { +		irc_write(iu->irc, "@%s :%s!%s@%s %s %s :%s", +			  tags, iu->nick, iu->user, iu->host, +			  type, dst, msg && *msg ? msg : " "); +	}  }  void irc_send_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *format, ...)  { -	char text[IRC_MAX_LINE];  	va_list params;  	va_start(params, format); -	g_vsnprintf(text, IRC_MAX_LINE, format, params); +	irc_send_tagged_msg_vf(iu, type, dst, NULL, format, params); +	va_end(params); + +} + +void irc_send_tagged_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, ...) +{ +	va_list params; + +	va_start(params, format); +	irc_send_tagged_msg_vf(iu, type, dst, tags, format, params);  	va_end(params); +} + +void irc_send_tagged_msg_vf(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, va_list params) +{ +	char text[IRC_MAX_LINE]; -	irc_write(iu->irc, ":%s!%s@%s %s %s :%s", -	          iu->nick, iu->user, iu->host, type, dst, text); +	g_vsnprintf(text, IRC_MAX_LINE, format, params); + +	if (!tags || !*tags) { +		irc_write(iu->irc, ":%s!%s@%s %s %s :%s", +			  iu->nick, iu->user, iu->host, +			  type, dst, text); +	} else { +		irc_write(iu->irc, "@%s :%s!%s@%s %s %s :%s", +			  tags, iu->nick, iu->user, iu->host, +			  type, dst, text); +	}  }  void irc_send_nick(irc_user_t *iu, const char *new) @@ -429,11 +469,27 @@ void irc_send_nick(irc_user_t *iu, const char *new)  void irc_send_channel_user_mode_diff(irc_channel_t *ic, irc_user_t *iu,                                       irc_channel_user_flags_t old, irc_channel_user_flags_t new)  { -	char changes[3 * (5 + strlen(iu->nick))]; -	char from[strlen(ic->irc->root->nick) + strlen(ic->irc->root->user) + strlen(ic->irc->root->host) + 3]; +	char changes[5 * (5 + strlen(iu->nick))]; +	char from[strlen(ic->irc->root->nick) + strlen(ic->irc->root->user) + strlen(ic->irc->root->host) + 5];  	int n;  	*changes = '\0'; n = 0; +	if ((old & IRC_CHANNEL_USER_OWNER) != (new & IRC_CHANNEL_USER_OWNER)) { +		n++; +		if (new & IRC_CHANNEL_USER_OWNER) { +			strcat(changes, "+q"); +		} else { +			strcat(changes, "-q"); +		} +	} +	if ((old & IRC_CHANNEL_USER_ADMIN) != (new & IRC_CHANNEL_USER_ADMIN)) { +		n++; +		if (new & IRC_CHANNEL_USER_ADMIN) { +			strcat(changes, "+a"); +		} else { +			strcat(changes, "-a"); +		} +	}  	if ((old & IRC_CHANNEL_USER_OP) != (new & IRC_CHANNEL_USER_OP)) {  		n++;  		if (new & IRC_CHANNEL_USER_OP) { | 
