Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc_im.c

    r24de9fa r03df717  
    8484        }
    8585
    86         while ((s = strchr(iu->user, ' '))) {
    87                 *s = '_';
    88         }
     86        /* Sanitize */
     87        str_reject_chars(iu->user, " ", '_');
     88        str_reject_chars(iu->host, " ", '_');
    8989
    9090        if (bu->flags & BEE_USER_LOCAL) {
     
    118118        if (bu->flags & BEE_USER_AWAY || !(bu->flags & BEE_USER_ONLINE)) {
    119119                iu->flags |= IRC_USER_AWAY;
     120        }
     121
     122        if ((irc->caps & CAP_AWAY_NOTIFY) &&
     123            ((bu->flags & BEE_USER_AWAY) != (old->flags & BEE_USER_AWAY) ||
     124             (bu->flags & BEE_USER_ONLINE) != (old->flags & BEE_USER_ONLINE))) {
     125                irc_send_away_notify(iu);
    120126        }
    121127
     
    201207}
    202208
    203 static gboolean bee_irc_user_msg(bee_t *bee, bee_user_t *bu, const char *msg_, time_t sent_at)
     209static gboolean bee_irc_user_msg(bee_t *bee, bee_user_t *bu, const char *msg_, guint32 flags, time_t sent_at)
    204210{
    205211        irc_t *irc = bee->ui_data;
    206212        irc_user_t *iu = (irc_user_t *) bu->ui_data;
     213        irc_user_t *src_iu = iu;
     214        irc_user_t *dst_iu = irc->user;
    207215        const char *dst;
    208216        char *prefix = NULL;
    209217        char *wrapped, *ts = NULL;
    210218        char *msg = g_strdup(msg_);
     219        char *message_type = "PRIVMSG";
    211220        GSList *l;
    212221
     
    216225
    217226        dst = irc_user_msgdest(iu);
    218         if (dst != irc->user->nick) {
    219                 /* if not messaging directly, call user by name */
    220                 prefix = g_strdup_printf("%s%s%s", irc->user->nick, set_getstr(&bee->set, "to_char"), ts ? : "");
     227
     228        if (flags & OPT_SELFMESSAGE) {
     229                char *setting = set_getstr(&irc->b->set, "self_messages");
     230
     231                if (is_bool(setting)) {
     232                        if (bool2int(setting)) {
     233                                /* set to true, send it with src/dst flipped */
     234                               
     235                                dst_iu = iu;
     236                                src_iu = irc->user;
     237
     238                                if (dst == irc->user->nick) {
     239                                        dst = dst_iu->nick;
     240                                }
     241                        } else {
     242                                /* set to false, skip the message completely */
     243                                goto cleanup;
     244                        }
     245                } else if (g_strncasecmp(setting, "prefix", 6) == 0) {
     246                        /* third state, prefix, loosely imitates the znc privmsg_prefix module */
     247
     248                        g_free(msg);
     249                        if (g_strncasecmp(msg_, "/me ", 4) == 0) {
     250                                msg = g_strdup_printf("/me -> %s", msg_ + 4);
     251                        } else {
     252                                msg = g_strdup_printf("-> %s", msg_);
     253                        }
     254
     255                        if (g_strcasecmp(setting, "prefix_notice") == 0) {
     256                                message_type = "NOTICE";
     257                        }
     258                }
     259
     260        }
     261
     262        if (dst != dst_iu->nick) {
     263                /* if not messaging directly (control channel), call user by name */
     264                prefix = g_strdup_printf("%s%s%s", dst_iu->nick, set_getstr(&bee->set, "to_char"), ts ? : "");
    221265        } else {
    222266                prefix = ts;
     
    249293
    250294        wrapped = word_wrap(msg, 425);
    251         irc_send_msg(iu, "PRIVMSG", dst, wrapped, prefix);
     295        irc_send_msg(src_iu, message_type, dst, wrapped, prefix);
    252296        g_free(wrapped);
    253297
     
    260304}
    261305
    262 static gboolean bee_irc_user_typing(bee_t *bee, bee_user_t *bu, uint32_t flags)
     306static gboolean bee_irc_user_typing(bee_t *bee, bee_user_t *bu, guint32 flags)
    263307{
    264308        irc_t *irc = (irc_t *) bee->ui_data;
     
    617661}
    618662
    619 static gboolean bee_irc_chat_msg(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, time_t sent_at)
     663static gboolean bee_irc_chat_msg(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, guint32 flags, time_t sent_at)
    620664{
    621665        irc_t *irc = bee->ui_data;
    622         irc_user_t *iu = bu->ui_data;
     666        irc_user_t *iu = flags & OPT_SELFMESSAGE ? irc->user : bu->ui_data;
    623667        irc_channel_t *ic = c->ui_data;
    624668        char *wrapped, *ts = NULL;
     
    654698}
    655699
    656 static gboolean bee_irc_chat_remove_user(bee_t *bee, struct groupchat *c, bee_user_t *bu)
     700static gboolean bee_irc_chat_remove_user(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *reason)
    657701{
    658702        irc_t *irc = bee->ui_data;
     
    666710           using imcb_chat_free() and the channel was IRC_CHANNEL_TEMP, we get into
    667711           a broken state around here. */
    668         irc_channel_del_user(ic, bu == bee->user ? irc->user : bu->ui_data, IRC_CDU_PART, NULL);
     712        irc_channel_del_user(ic, bu == bee->user ? irc->user : bu->ui_data, IRC_CDU_PART, reason);
    669713
    670714        return TRUE;
     
    839883            acc->prpl->chat_join) {
    840884                char *nick;
     885                struct groupchat *gc;
    841886
    842887                if (!(nick = set_getstr(&ic->set, "nick"))) {
     
    845890
    846891                ic->flags |= IRC_CHANNEL_CHAT_PICKME;
    847                 acc->prpl->chat_join(acc->ic, room, nick, NULL, &ic->set);
     892                gc = acc->prpl->chat_join(acc->ic, room, nick, NULL, &ic->set);
    848893                ic->flags &= ~IRC_CHANNEL_CHAT_PICKME;
     894
     895                if (!gc) {
     896                        irc_send_num(ic->irc, 403, "%s :Error joining channel (check control channel?)", ic->name);
     897                }
    849898
    850899                return FALSE;
     
    863912        }
    864913
    865         /* Remove the reference. We don't need it anymore. */
    866         ic->data = NULL;
     914        if (!(ic->flags & IRC_CHANNEL_TEMP)) {
     915                /* Remove the reference.
     916                 * We only need it for temp channels that are being freed */
     917                ic->data = NULL;
     918        }
    867919
    868920        return TRUE;
     
    10551107                df->proto_finished = TRUE;
    10561108        }
     1109}
     1110
     1111static void bee_irc_log(bee_t *bee, const char *tag, const char *msg)
     1112{
     1113        irc_t *irc = (irc_t *) bee->ui_data;
     1114
     1115        irc_rootmsg(irc, "%s - %s", tag, msg);
    10571116}
    10581117
     
    10851144        bee_irc_ft_close,
    10861145        bee_irc_ft_finished,
     1146
     1147        bee_irc_log,
    10871148};
Note: See TracChangeset for help on using the changeset viewer.