Add operspy /topic.
This allows querying any channel's topic under the operspy rules, but not changing it.
This commit is contained in:
parent
dffb83aa69
commit
41615da91c
2 changed files with 31 additions and 9 deletions
|
@ -11,3 +11,4 @@ who !#channel - Gives a full output of users on the channel.
|
||||||
mode !#channel - Gives the full modes of a channel including any keys.
|
mode !#channel - Gives the full modes of a channel including any keys.
|
||||||
chantrace !#channel - Gives full output despite not being on channel.
|
chantrace !#channel - Gives full output despite not being on channel.
|
||||||
masktrace !nick!user@host :gecos - Lists matching users on all servers.
|
masktrace !nick!user@host :gecos - Lists matching users on all servers.
|
||||||
|
topic !#channel - Gives full output despite not being on channel.
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "ircd.h"
|
#include "ircd.h"
|
||||||
#include "numeric.h"
|
#include "numeric.h"
|
||||||
#include "send.h"
|
#include "send.h"
|
||||||
|
#include "s_newconf.h"
|
||||||
#include "s_conf.h"
|
#include "s_conf.h"
|
||||||
#include "s_serv.h"
|
#include "s_serv.h"
|
||||||
#include "msg.h"
|
#include "msg.h"
|
||||||
|
@ -62,26 +63,43 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
|
||||||
struct Channel *chptr = NULL;
|
struct Channel *chptr = NULL;
|
||||||
struct membership *msptr;
|
struct membership *msptr;
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
|
const char *name;
|
||||||
|
int operspy = 0;
|
||||||
|
|
||||||
if((p = strchr(parv[1], ',')))
|
if((p = strchr(parv[1], ',')))
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
||||||
|
name = parv[1];
|
||||||
|
|
||||||
|
if(IsOperSpy(source_p) && parv[1][0] == '!')
|
||||||
|
{
|
||||||
|
name++;
|
||||||
|
operspy = 1;
|
||||||
|
|
||||||
|
if(EmptyString(name))
|
||||||
|
{
|
||||||
|
sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
|
||||||
|
me.name, source_p->name, "TOPIC");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(MyClient(source_p) && !IsFloodDone(source_p))
|
if(MyClient(source_p) && !IsFloodDone(source_p))
|
||||||
flood_endgrace(source_p);
|
flood_endgrace(source_p);
|
||||||
|
|
||||||
if(!IsChannelName(parv[1]))
|
if(!IsChannelName(name))
|
||||||
{
|
{
|
||||||
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
|
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
|
||||||
form_str(ERR_NOSUCHCHANNEL), parv[1]);
|
form_str(ERR_NOSUCHCHANNEL), name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
chptr = find_channel(parv[1]);
|
chptr = find_channel(name);
|
||||||
|
|
||||||
if(chptr == NULL)
|
if(chptr == NULL)
|
||||||
{
|
{
|
||||||
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
|
sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
|
||||||
form_str(ERR_NOSUCHCHANNEL), parv[1]);
|
form_str(ERR_NOSUCHCHANNEL), name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +111,7 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
|
||||||
if(msptr == NULL)
|
if(msptr == NULL)
|
||||||
{
|
{
|
||||||
sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
|
sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
|
||||||
form_str(ERR_NOTONCHANNEL), parv[1]);
|
form_str(ERR_NOTONCHANNEL), name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,19 +134,22 @@ m_topic(struct Client *client_p, struct Client *source_p, int parc, const char *
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
|
sendto_one(source_p, form_str(ERR_CHANOPRIVSNEEDED),
|
||||||
me.name, source_p->name, parv[1]);
|
me.name, source_p->name, name);
|
||||||
}
|
}
|
||||||
else if(MyClient(source_p))
|
else if(MyClient(source_p))
|
||||||
{
|
{
|
||||||
if(!IsMember(source_p, chptr) && SecretChannel(chptr))
|
if(operspy)
|
||||||
|
report_operspy(source_p, "TOPIC", chptr->chname);
|
||||||
|
if(!IsMember(source_p, chptr) && SecretChannel(chptr) &&
|
||||||
|
!operspy)
|
||||||
{
|
{
|
||||||
sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
|
sendto_one_numeric(source_p, ERR_NOTONCHANNEL,
|
||||||
form_str(ERR_NOTONCHANNEL), parv[1]);
|
form_str(ERR_NOTONCHANNEL), name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(chptr->topic == NULL)
|
if(chptr->topic == NULL)
|
||||||
sendto_one(source_p, form_str(RPL_NOTOPIC),
|
sendto_one(source_p, form_str(RPL_NOTOPIC),
|
||||||
me.name, source_p->name, parv[1]);
|
me.name, source_p->name, name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sendto_one(source_p, form_str(RPL_TOPIC),
|
sendto_one(source_p, form_str(RPL_TOPIC),
|
||||||
|
|
Loading…
Reference in a new issue