]> jfr.im git - solanum.git/blobdiff - modules/m_trace.c
extensions/invite_notify: make the NOTICE optional, configurable
[solanum.git] / modules / m_trace.c
index 38550667a25f23a54d67e9211968a60011711c51..ae9a0057829e96d71b7574c6680164873a60f63a 100644 (file)
@@ -52,10 +52,12 @@ struct Message trace_msgtab = {
 };
 
 int doing_trace_hook;
+int doing_trace_show_idle_hook;
 
 mapi_clist_av1 trace_clist[] = { &trace_msgtab, NULL };
 mapi_hlist_av1 trace_hlist[] = {
        { "doing_trace",        &doing_trace_hook },
+       { "doing_trace_show_idle", &doing_trace_show_idle_hook },
        { NULL, NULL }
 };
 DECLARE_MODULE_AV2(trace, NULL, NULL, trace_clist, trace_hlist, NULL, NULL, NULL, trace_desc);
@@ -125,7 +127,7 @@ m_trace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
                        /* giving this out with flattened links defeats the
                         * object --fl
                         */
-                       if(IsOper(source_p) || IsExemptShide(source_p) ||
+                       if(IsOperGeneral(source_p) || IsExemptShide(source_p) ||
                           !ConfigServerHide.flatten_links)
                                sendto_one_numeric(source_p, RPL_TRACELINK,
                                                   form_str(RPL_TRACELINK),
@@ -204,6 +206,9 @@ m_trace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
                        if(!doall && wilds && (match(tname, target_p->name) == 0))
                                continue;
 
+                       if(!SeesOper(target_p, source_p))
+                               continue;
+
                        report_this_status(source_p, target_p);
                }
 
@@ -233,14 +238,14 @@ m_trace(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_
                target_p = ptr->data;
 
                /* dont show invisible users to remote opers */
-               if(IsInvisible(target_p) && dow && !MyConnect(source_p) && !IsOper(target_p))
+               if(IsInvisible(target_p) && dow && !MyConnect(source_p) && !SeesOper(target_p, source_p))
                        continue;
 
                if(!doall && wilds && !match(tname, target_p->name))
                        continue;
 
                /* remote opers may not see invisible normal users */
-               if(dow && !MyConnect(source_p) && !IsOper(target_p) &&
+               if(dow && !MyConnect(source_p) && !SeesOper(target_p, source_p) &&
                                IsInvisible(target_p))
                        continue;
 
@@ -378,13 +383,22 @@ report_this_status(struct Client *source_p, struct Client *target_p)
 
        case STAT_CLIENT:
                {
+                       /* fire the doing_trace_show_idle hook to allow modules to tell us whether to show the idle time */
+                       hook_data_client_approval hdata_showidle;
+
+                       hdata_showidle.client = source_p;
+                       hdata_showidle.target = target_p;
+                       hdata_showidle.approved = WHOIS_IDLE_SHOW;
+
+                       call_hook(doing_trace_show_idle_hook, &hdata_showidle);
+
                        sendto_one_numeric(source_p,
-                                       IsOper(target_p) ? RPL_TRACEOPERATOR : RPL_TRACEUSER,
-                                       IsOper(target_p) ? form_str(RPL_TRACEOPERATOR) : form_str(RPL_TRACEUSER),
+                                       SeesOper(target_p, source_p) ? RPL_TRACEOPERATOR : RPL_TRACEUSER,
+                                       SeesOper(target_p, source_p) ? form_str(RPL_TRACEOPERATOR) : form_str(RPL_TRACEUSER),
                                        class_name, name,
                                        show_ip(source_p, target_p) ? ip : empty_sockhost,
-                                       (unsigned long)(rb_current_time() - target_p->localClient->lasttime),
-                                       (unsigned long)(rb_current_time() - target_p->localClient->last));
+                                       hdata_showidle.approved ? (unsigned long)(rb_current_time() - target_p->localClient->lasttime) : 0,
+                                       hdata_showidle.approved ? (unsigned long)(rb_current_time() - target_p->localClient->last) : 0);
 
                        cnt++;
                }