ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/modules/m_topic.c
Revision: 9082
Committed: Sun Oct 13 09:58:37 2019 UTC (6 years, 9 months ago) by michael
Content type: text/x-csrc
File size: 6620 byte(s)
Log Message:
- Rename struct Membership to ChannelMember
- Rename Channel::last_knock to last_knock_time
- Rename Channel::last_invite to last_invite_time
- Rename chptr to channel

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
4 * Copyright (c) 1997-2019 ircd-hybrid development team
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
19 * USA
20 */
21
22 /*! \file m_topic.c
23 * \brief Includes required functions for processing the TOPIC command.
24 * \version $Id$
25 */
26
27 #include "stdinc.h"
28 #include "list.h"
29 #include "channel.h"
30 #include "channel_mode.h"
31 #include "client.h"
32 #include "conf.h"
33 #include "hash.h"
34 #include "irc_string.h"
35 #include "ircd.h"
36 #include "numeric.h"
37 #include "send.h"
38 #include "parse.h"
39 #include "modules.h"
40 #include "packet.h"
41
42
43 /*! \brief TOPIC command handler
44 *
45 * \param source_p Pointer to allocated Client struct from which the message
46 * originally comes from. This can be a local or remote client.
47 * \param parc Integer holding the number of supplied arguments.
48 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
49 * pointers.
50 * \note Valid arguments for this command are:
51 * - parv[0] = command
52 * - parv[1] = channel name
53 * - parv[2] = topic text, if setting topic (can be an empty string)
54 */
55 static void
56 m_topic(struct Client *source_p, int parc, char *parv[])
57 {
58 struct Channel *channel = NULL;
59
60 if (EmptyString(parv[1]))
61 {
62 sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "TOPIC");
63 return;
64 }
65
66 if ((channel = hash_find_channel(parv[1])) == NULL)
67 {
68 sendto_one_numeric(source_p, &me, ERR_NOSUCHCHANNEL, parv[1]);
69 return;
70 }
71
72 /* setting topic */
73 if (parc > 2)
74 {
75 const struct ChannelMember *member = NULL;
76
77 if ((member = find_channel_link(source_p, channel)) == NULL)
78 {
79 sendto_one_numeric(source_p, &me, ERR_NOTONCHANNEL, channel->name);
80 return;
81 }
82
83 if (!HasCMode(channel, MODE_TOPICLIMIT) ||
84 has_member_flags(member, CHFL_CHANOP | CHFL_HALFOP))
85 {
86 char topic_info[NICKLEN + USERLEN + HOSTLEN + 3]; /* +3 for !, @, \0 */
87
88 snprintf(topic_info, sizeof(topic_info), "%s!%s@%s", source_p->name,
89 source_p->username, source_p->host);
90 channel_set_topic(channel, parv[2], topic_info, event_base->time.sec_real, true);
91
92 sendto_server(source_p, 0, 0, ":%s TOPIC %s :%s",
93 source_p->id, channel->name,
94 channel->topic);
95 sendto_channel_local(NULL, channel, 0, 0, 0, ":%s!%s@%s TOPIC %s :%s",
96 source_p->name,
97 source_p->username,
98 source_p->host,
99 channel->name, channel->topic);
100 }
101 else
102 sendto_one_numeric(source_p, &me, ERR_CHANOPRIVSNEEDED, channel->name);
103 }
104 else /* only asking for topic */
105 {
106 if (!SecretChannel(channel) || IsMember(source_p, channel))
107 {
108 if (channel->topic[0] == '\0')
109 sendto_one_numeric(source_p, &me, RPL_NOTOPIC, channel->name);
110 else
111 {
112 sendto_one_numeric(source_p, &me, RPL_TOPIC,
113 channel->name, channel->topic);
114 sendto_one_numeric(source_p, &me, RPL_TOPICWHOTIME, channel->name,
115 channel->topic_info,
116 channel->topic_time);
117 }
118 }
119 else
120 sendto_one_numeric(source_p, &me, ERR_NOTONCHANNEL, channel->name);
121 }
122 }
123
124
125 /*! \brief TOPIC command handler
126 *
127 * \param source_p Pointer to allocated Client struct from which the message
128 * originally comes from. This can be a local or remote client.
129 * \param parc Integer holding the number of supplied arguments.
130 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
131 * pointers.
132 * \note Valid arguments for this command are:
133 * - parv[0] = command
134 * - parv[1] = channel name
135 * - parv[2] = topic text (can be an empty string)
136 */
137 static void
138 ms_topic(struct Client *source_p, int parc, char *parv[])
139 {
140 struct Channel *channel = NULL;
141 char topic_info[NICKLEN + USERLEN + HOSTLEN + 3]; /* +3 for !, @, \0 */
142
143 if (parc < 3)
144 {
145 sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "TOPIC");
146 return;
147 }
148
149 if ((channel = hash_find_channel(parv[1])) == NULL)
150 {
151 sendto_one_numeric(source_p, &me, ERR_NOSUCHCHANNEL, parv[1]);
152 return;
153 }
154
155 if (IsClient(source_p))
156 snprintf(topic_info, sizeof(topic_info), "%s!%s@%s", source_p->name,
157 source_p->username, source_p->host);
158 else if (IsHidden(source_p) || ConfigServerHide.hide_servers)
159 strlcpy(topic_info, me.name, sizeof(topic_info));
160 else
161 strlcpy(topic_info, source_p->name, sizeof(topic_info));
162
163 channel_set_topic(channel, parv[2], topic_info, event_base->time.sec_real, false);
164
165 sendto_server(source_p, 0, 0, ":%s TOPIC %s :%s",
166 source_p->id, channel->name,
167 channel->topic);
168
169 if (IsClient(source_p))
170 sendto_channel_local(NULL, channel, 0, 0, 0, ":%s!%s@%s TOPIC %s :%s",
171 source_p->name,
172 source_p->username,
173 source_p->host,
174 channel->name, channel->topic);
175 else
176 sendto_channel_local(NULL, channel, 0, 0, 0, ":%s TOPIC %s :%s",
177 (IsHidden(source_p) || ConfigServerHide.hide_servers) ? me.name : source_p->name,
178 channel->name, channel->topic);
179 }
180
181 static struct Message topic_msgtab =
182 {
183 .cmd = "TOPIC",
184 .args_min = 2,
185 .args_max = MAXPARA,
186 .flags = MFLG_ENDGRACE,
187 .handlers[UNREGISTERED_HANDLER] = m_unregistered,
188 .handlers[CLIENT_HANDLER] = m_topic,
189 .handlers[SERVER_HANDLER] = ms_topic,
190 .handlers[ENCAP_HANDLER] = m_ignore,
191 .handlers[OPER_HANDLER] = m_topic
192 };
193
194 static void
195 module_init(void)
196 {
197 mod_add_cmd(&topic_msgtab);
198 }
199
200 static void
201 module_exit(void)
202 {
203 mod_del_cmd(&topic_msgtab);
204 }
205
206 struct module module_entry =
207 {
208 .version = "$Revision$",
209 .modinit = module_init,
210 .modexit = module_exit,
211 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision