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