| 420 return 0; |
420 return 0; |
| 421 } |
421 } |
| 422 |
422 |
| 423 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
423 int irc_cmd_privmsg(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
| 424 { |
424 { |
| |
425 int max_privmsg_arg_len; |
| 425 const char *cur, *end; |
426 const char *cur, *end; |
| |
427 gchar *salvaged; |
| 426 char *msg, *buf; |
428 char *msg, *buf; |
| 427 |
429 |
| 428 if (!args || !args[0] || !args[1]) |
430 if (!args || !args[0] || !args[1]) |
| 429 return 0; |
431 return 0; |
| 430 |
432 |
| 431 cur = args[1]; |
433 max_privmsg_arg_len = IRC_MAX_MSG_SIZE - strlen(args[0]) - 64; |
| 432 end = args[1]; |
434 salvaged = purple_utf8_salvage(args[1]); |
| |
435 cur = salvaged; |
| |
436 end = salvaged; |
| 433 while (*end && *cur) { |
437 while (*end && *cur) { |
| 434 end = strchr(cur, '\n'); |
438 end = strchr(cur, '\n'); |
| 435 if (!end) |
439 if (!end) |
| 436 end = cur + strlen(cur); |
440 end = cur + strlen(cur); |
| |
441 if (end - cur > max_privmsg_arg_len) { |
| |
442 /* this call is used to find the last valid character position in the first |
| |
443 * max_privmsg_arg_len bytes of the utf-8 message |
| |
444 */ |
| |
445 g_utf8_validate(cur, max_privmsg_arg_len, &end); |
| |
446 } |
| |
447 |
| 437 msg = g_strndup(cur, end - cur); |
448 msg = g_strndup(cur, end - cur); |
| 438 |
449 |
| 439 if(!strcmp(cmd, "notice")) |
450 if(!strcmp(cmd, "notice")) |
| 440 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg); |
451 buf = irc_format(irc, "vt:", "NOTICE", args[0], msg); |
| 441 else |
452 else |
| 442 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); |
453 buf = irc_format(irc, "vt:", "PRIVMSG", args[0], msg); |
| 443 |
454 |
| 444 irc_send(irc, buf); |
455 irc_send(irc, buf); |
| 445 g_free(msg); |
456 g_free(msg); |
| 446 g_free(buf); |
457 g_free(buf); |
| 447 cur = end + 1; |
458 cur = end; |
| 448 } |
459 if(*cur == '\n') { |
| |
460 cur++; |
| |
461 } |
| |
462 } |
| |
463 |
| |
464 g_free(salvaged); |
| 449 |
465 |
| 450 return 0; |
466 return 0; |
| 451 } |
467 } |
| 452 |
468 |
| 453 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |
469 int irc_cmd_quit(struct irc_conn *irc, const char *cmd, const char *target, const char **args) |