diff options
Diffstat (limited to 'otr.c')
-rw-r--r-- | otr.c | 67 |
1 files changed, 46 insertions, 21 deletions
@@ -981,31 +981,56 @@ const char *peernick(irc_t *irc, const char *handle, const char *protocol) int otr_update_modeflags(irc_t *irc, user_t *u) { - char *vo = set_getstr(&irc->set, "voice_buddies"); - char *oo = set_getstr(&irc->set, "op_buddies"); - char eflag=0, tflag=0; - int e = u->encrypted; - int t = (u->encrypted > 1); + char *vb = set_getstr(&irc->set, "voice_buddies"); + char *hb = set_getstr(&irc->set, "halfop_buddies"); + char *ob = set_getstr(&irc->set, "op_buddies"); + int encrypted = u->encrypted; + int trusted = u->encrypted > 1; + char flags[7]; + int nflags; + char *p = flags; + int i; - if(!strcmp(vo, "encrypted")) - eflag='v'; - else if(!strcmp(oo, "encrypted")) - eflag='o'; - if(!strcmp(vo, "trusted")) - tflag='v'; - else if(!strcmp(oo, "trusted")) - tflag='o'; + if(!strcmp(vb, "encrypted")) { + *(p++) = encrypted ? '+' : '-'; + *(p++) = 'v'; + nflags++; + } else if(!strcmp(vb, "trusted")) { + *(p++) = trusted ? '+' : '-'; + *(p++) = 'v'; + nflags++; + } + if(!strcmp(hb, "encrypted")) { + *(p++) = encrypted ? '+' : '-'; + *(p++) = 'h'; + nflags++; + } else if(!strcmp(hb, "trusted")) { + *(p++) = trusted ? '+' : '-'; + *(p++) = 'h'; + nflags++; + } + if(!strcmp(ob, "encrypted")) { + *(p++) = encrypted ? '+' : '-'; + *(p++) = 'o'; + nflags++; + } else if(!strcmp(ob, "trusted")) { + *(p++) = trusted ? '+' : '-'; + *(p++) = 'o'; + nflags++; + } + *p = '\0'; - if(!eflag) + p = g_malloc(nflags * (strlen(u->nick)+1) + 1); + *p = '\0'; + if(!p) return 0; - - if(tflag) { - irc_write( irc, ":%s!%s@%s MODE %s %c%c%c%c %s %s", irc->mynick, irc->mynick, irc->myhost, - irc->channel, e?'+':'-', eflag, t?'+':'-', tflag, u->nick, u->nick ); - } else { - irc_write( irc, ":%s!%s@%s MODE %s %c%c %s", irc->mynick, irc->mynick, irc->myhost, - irc->channel, e?'+':'-', eflag, u->nick ); + for(i=0; i<nflags; i++) { + strcat(p, " "); + strcat(p, u->nick); } + irc_write( irc, ":%s!%s@%s MODE %s %s%s", irc->mynick, irc->mynick, irc->myhost, + irc->channel, flags, p ); + g_free(p); return 1; } |