diff options
-rw-r--r-- | irc.c | 1 | ||||
-rw-r--r-- | otr.c | 67 | ||||
-rw-r--r-- | protocols/nogaim.c | 4 | ||||
-rw-r--r-- | set.c | 5 | ||||
-rw-r--r-- | set.h | 1 |
5 files changed, 57 insertions, 21 deletions
@@ -112,6 +112,7 @@ irc_t *irc_new( int fd ) set_add( &irc->set, "default_target", "root", NULL, irc ); set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc ); set_add( &irc->set, "handle_unknown", "root", NULL, irc ); + set_add( &irc->set, "halfop_buddies", "false", set_eval_halfop_buddies, irc ); set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc ); set_add( &irc->set, "op_buddies", "false", set_eval_op_buddies, irc ); set_add( &irc->set, "op_root", "true", set_eval_op_root, irc ); @@ -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; } diff --git a/protocols/nogaim.c b/protocols/nogaim.c index 542a4269..c2966323 100644 --- a/protocols/nogaim.c +++ b/protocols/nogaim.c @@ -621,6 +621,10 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags, irc_write( ic->irc, ":%s MODE %s %cv %s", from, ic->irc->channel, u->away?'-':'+', u->nick ); } + if(!strcmp(set_getstr(&ic->irc->set, "halfop_buddies"), "notaway")) { + irc_write( ic->irc, ":%s MODE %s %ch %s", from, ic->irc->channel, + u->away?'-':'+', u->nick ); + } if(!strcmp(set_getstr(&ic->irc->set, "op_buddies"), "notaway")) { irc_write( ic->irc, ":%s MODE %s %co %s", from, ic->irc->channel, u->away?'-':'+', u->nick ); @@ -344,6 +344,11 @@ char *set_eval_op_buddies( set_t *set, char *value ) return set_eval_mode_buddies(set, value, 'o'); } +char *set_eval_halfop_buddies( set_t *set, char *value ) +{ + return set_eval_mode_buddies(set, value, 'h'); +} + char *set_eval_voice_buddies( set_t *set, char *value ) { return set_eval_mode_buddies(set, value, 'v'); @@ -98,6 +98,7 @@ char *set_eval_to_char( set_t *set, char *value ); char *set_eval_op_root( set_t *set, char *value ); char *set_eval_op_user( set_t *set, char *value ); char *set_eval_op_buddies( set_t *set, char *value ); +char *set_eval_halfop_buddies( set_t *set, char *value ); char *set_eval_voice_buddies( set_t *set, char *value ); char *set_eval_charset( set_t *set, char *value ); |