summaryrefslogtreecommitdiff
path: root/src/core/cs_access.c
diff options
context:
space:
mode:
authorAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-11-06 02:08:15 +0000
committerAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-11-06 02:08:15 +0000
commit3317f406d26d29bd7f009d93b2680fd118b2a0b0 (patch)
tree60e730e1d154d2624d42eef6e8138633a4c4e21c /src/core/cs_access.c
parent95a017db9f3761e209bb3a43d02aad1630cfc022 (diff)
Added /chanserv access view, which shows the access creator and last time used
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2611 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/core/cs_access.c')
-rw-r--r--src/core/cs_access.c76
1 files changed, 74 insertions, 2 deletions
diff --git a/src/core/cs_access.c b/src/core/cs_access.c
index bdf32b9d7..f784b3406 100644
--- a/src/core/cs_access.c
+++ b/src/core/cs_access.c
@@ -80,6 +80,51 @@ static int access_list_callback(User * u, int num, va_list args)
return access_list(u, num - 1, ci, sent_header);
}
+static int access_view(User *u, int index, ChannelInfo *ci, int *sent_header)
+{
+ ChanAccess *access = ci->GetAccess(index);
+ const char *xop;
+ char timebuf[64];
+ tm tm;
+
+ if (!access || !access->in_use)
+ return 0;
+
+ if (!*sent_header)
+ {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_HEADER, ci->name);
+ *sent_header = 1;
+ }
+
+ memset(&timebuf, 0, sizeof(timebuf));
+ if (ci->c && u->nc && nc_on_chan(ci->c, u->nc))
+ sprintf(timebuf, "Now");
+ else if (access->last_seen == 0)
+ sprintf(timebuf, "Never");
+ else
+ {
+ tm = *localtime(&access->last_seen);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_DATE_TIME_FORMAT, &tm);
+ }
+
+ if (ci->flags & CI_XOP)
+ {
+ xop = get_xop_level(access->level);
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_VIEW_XOP_FORMAT, index + 1, xop, access->nc->display, access->creator.c_str(), timebuf);
+ }
+ else
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_VIEW_AXS_FORMAT, index + 1, access->level, access->nc->display, access->creator.c_str(), timebuf);
+
+ return 1;
+}
+
+static int access_view_callback(User *u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ return 0;
+ return access_view(u, num - 1, ci, sent_header);
+}
class CommandCSAccess : public Command
{
@@ -102,7 +147,7 @@ class CommandCSAccess : public Command
unsigned i;
int level = 0, ulev;
- bool is_list = cmd == "LIST";
+ bool is_list = cmd == "LIST" || cmd == "VIEW";
/* If LIST, we don't *require* any parameters, but we can take any.
* If DEL, we require a nick and no level.
@@ -193,7 +238,8 @@ class CommandCSAccess : public Command
return MOD_CONT;
}
- ci->AddAccess(nc, level);
+ std::string usernick = u->nick;
+ ci->AddAccess(nc, level, usernick);
FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, na->nick, level));
@@ -307,6 +353,32 @@ class CommandCSAccess : public Command
else
notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_FOOTER, ci->name);
}
+ else if (cmd == "VIEW")
+ {
+ int sent_header = 0;
+
+ if (ci->access.empty())
+ {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+ if (nick && strspn(nick, "1234567890,-") == strlen(nick))
+ process_numlist(nick, NULL, access_view_callback, u, ci, &sent_header);
+ else
+ {
+ for (i = 0; i < ci->access.size(); ++i)
+ {
+ access = ci->GetAccess(i);
+ if (nick && access->nc && !Anope::Match(access->nc->display, nick, false))
+ continue;
+ access_view(u, i, ci, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_MATCH, chan);
+ else
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_FOOTER, ci->name);
+ }
else if (cmd == "CLEAR")
{
if (readonly)