summaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/cmd_topic.cpp88
1 files changed, 19 insertions, 69 deletions
diff --git a/src/commands/cmd_topic.cpp b/src/commands/cmd_topic.cpp
index 0e1a115da..3f2bc1f06 100644
--- a/src/commands/cmd_topic.cpp
+++ b/src/commands/cmd_topic.cpp
@@ -22,93 +22,43 @@ extern "C" DllExport Command* init_command(InspIRCd* Instance)
CmdResult CommandTopic::Handle (const std::vector<std::string>& parameters, User *user)
{
- Channel* Ptr;
+ Channel* c;
+
+ c = ServerInstance->FindChan(parameters[0]);
+ if (!c)
+ {
+ user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), parameters[0].c_str());
+ return CMD_FAILURE;
+ }
if (parameters.size() == 1)
{
- Ptr = ServerInstance->FindChan(parameters[0]);
- if (Ptr)
+ if (c)
{
- if ((Ptr->IsModeSet('s')) && (!Ptr->HasUser(user)))
+ if ((c->IsModeSet('s')) && (!c->HasUser(user)))
{
- user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), Ptr->name.c_str());
+ user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), c->name.c_str());
return CMD_FAILURE;
}
- if (Ptr->topicset)
+
+ if (c->topic.length())
{
- user->WriteNumeric(332, "%s %s :%s", user->nick.c_str(), Ptr->name.c_str(), Ptr->topic.c_str());
- user->WriteNumeric(333, "%s %s %s %lu", user->nick.c_str(), Ptr->name.c_str(), Ptr->setby.c_str(), (unsigned long)Ptr->topicset);
+ user->WriteNumeric(332, "%s %s :%s", user->nick.c_str(), c->name.c_str(), c->topic.c_str());
+ user->WriteNumeric(333, "%s %s %s %lu", user->nick.c_str(), c->name.c_str(), c->setby.c_str(), (unsigned long)c->topicset);
}
else
{
- user->WriteNumeric(331, "%s %s :No topic is set.", user->nick.c_str(), Ptr->name.c_str());
+ user->WriteNumeric(331, "%s %s :No topic is set.", user->nick.c_str(), c->name.c_str());
}
}
- else
- {
- user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), parameters[0].c_str());
- return CMD_FAILURE;
- }
return CMD_SUCCESS;
}
else if (parameters.size()>1)
{
- Ptr = ServerInstance->FindChan(parameters[0]);
- if (Ptr)
- {
- if (IS_LOCAL(user))
- {
- if (!Ptr->HasUser(user))
- {
- user->WriteNumeric(442, "%s %s :You're not on that channel!",user->nick.c_str(), Ptr->name.c_str());
- return CMD_FAILURE;
- }
- if ((Ptr->IsModeSet('t')) && (Ptr->GetStatus(user) < STATUS_HOP))
- {
- user->WriteNumeric(482, "%s %s :You must be at least a half-operator to change the topic on this channel", user->nick.c_str(), Ptr->name.c_str());
- return CMD_FAILURE;
- }
- }
-
- std::string topic;
-
- if (IS_LOCAL(user))
- {
- /* XXX: we need two string copies for a local topic, because we cant
- * let a module see the topic as longer than it actually is
- */
- int MOD_RESULT = 0;
-
- topic.assign(parameters[1], 0, ServerInstance->Config->Limits.MaxTopic);
- FOREACH_RESULT(I_OnLocalTopicChange,OnLocalTopicChange(user,Ptr,topic));
- if (MOD_RESULT)
- return CMD_FAILURE;
-
- Ptr->topic.assign(topic, 0, ServerInstance->Config->Limits.MaxTopic);
- }
- else
- {
- /* Sneaky shortcut, one string copy for a remote topic */
- Ptr->topic.assign(parameters[1], 0, ServerInstance->Config->Limits.MaxTopic);
- }
-
- Ptr->setby.assign(ServerInstance->Config->FullHostInTopic ?
- user->GetFullHost() : user->nick,
- 0, 128);
-
- Ptr->topicset = ServerInstance->Time();
- Ptr->WriteChannel(user, "TOPIC %s :%s", Ptr->name.c_str(), Ptr->topic.c_str());
-
- if (IS_LOCAL(user))
- /* We know 'topic' will contain valid data here */
- FOREACH_MOD(I_OnPostLocalTopicChange,OnPostLocalTopicChange(user, Ptr, topic));
- }
- else
- {
- user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), parameters[0].c_str());
- return CMD_FAILURE;
- }
+ std::string t = parameters[1]; // needed, in case a module wants to change it
+ c->SetTopic(user, t);
}
+
return CMD_SUCCESS;
}