44 |
|
MODCONSTRUCTOR(SmartISON) {} |
45 |
|
virtual ~SmartISON() {} |
46 |
|
|
47 |
+ |
virtual EModRet OnCTCPReply(CNick &nick, CString &message) |
48 |
+ |
{ |
49 |
+ |
nicks_[nick.GetNick()] = true; |
50 |
+ |
|
51 |
+ |
return CONTINUE; |
52 |
+ |
} |
53 |
+ |
|
54 |
+ |
virtual void OnKick(const CNick &nick, const CString &opNick, CChan &chan, const CString &message) |
55 |
+ |
{ |
56 |
+ |
queue_.push_front(nick.GetNick()); |
57 |
+ |
} |
58 |
+ |
|
59 |
|
virtual bool OnLoad(const CString &args, CString &message) |
60 |
|
{ |
61 |
|
return AddTimer(new SmartISONTimer(this)); |
77 |
|
table.AddRow(); |
78 |
|
table.SetCell("Command", "Queue"); |
79 |
|
table.SetCell("Description", "List the nick status queue"); |
80 |
+ |
table.AddRow(); |
81 |
+ |
table.SetCell("Command", "Version"); |
82 |
+ |
table.SetCell("Description", "Display module version"); |
83 |
|
|
84 |
|
PutModule(table); |
85 |
|
} |
121 |
|
|
122 |
|
PutModule(table); |
123 |
|
} |
124 |
+ |
else if (theCommand.Equals("Version")) |
125 |
+ |
PutModule("$Id$"); |
126 |
|
else |
127 |
|
PutModule("Unknown command [" + theCommand + "] try 'Help'"); |
128 |
|
} |
129 |
|
|
130 |
+ |
virtual void OnModCTCP(const CString &message) |
131 |
+ |
{ |
132 |
+ |
CString command(message.Token(0)); |
133 |
+ |
|
134 |
+ |
if (command.Equals("PING")) |
135 |
+ |
PutModNotice("\001PING " + message.Token(1, true) + "\001"); |
136 |
+ |
else if (command.Equals("Version")) |
137 |
+ |
PutModNotice("\001VERSION $Id$\001"); |
138 |
+ |
} |
139 |
+ |
|
140 |
|
virtual void OnNick(const CNick &nick, const CString &newNick, const std::vector<CChan *> &chans) |
141 |
|
{ |
142 |
|
const CString &oldNick(nick.GetNick()); |
145 |
|
nicks_[newNick] = true; |
146 |
|
} |
147 |
|
|
148 |
+ |
virtual void OnPart(const CNick &nick, CChan &chan) |
149 |
+ |
{ |
150 |
+ |
queue_.push_front(nick.GetNick()); |
151 |
+ |
} |
152 |
+ |
|
153 |
+ |
virtual EModRet OnPrivAction(CNick &nick, CString &message) |
154 |
+ |
{ |
155 |
+ |
nicks_[nick.GetNick()] = true; |
156 |
+ |
|
157 |
+ |
return CONTINUE; |
158 |
+ |
} |
159 |
+ |
|
160 |
+ |
virtual EModRet OnPrivCTCP(CNick &nick, CString &message) |
161 |
+ |
{ |
162 |
+ |
nicks_[nick.GetNick()] = true; |
163 |
+ |
|
164 |
+ |
return CONTINUE; |
165 |
+ |
} |
166 |
+ |
|
167 |
+ |
virtual EModRet OnPrivMsg(CNick &nick, CString &message) |
168 |
+ |
{ |
169 |
+ |
nicks_[nick.GetNick()] = true; |
170 |
+ |
|
171 |
+ |
return CONTINUE; |
172 |
+ |
} |
173 |
+ |
|
174 |
+ |
virtual EModRet OnPrivNotice(CNick &nick, CString &message) |
175 |
+ |
{ |
176 |
+ |
nicks_[nick.GetNick()] = true; |
177 |
+ |
|
178 |
+ |
return CONTINUE; |
179 |
+ |
} |
180 |
+ |
|
181 |
|
virtual void OnQuit(const CNick &nick, const CString &message, const std::vector<CChan *> &chans) |
182 |
|
{ |
183 |
|
const CString &theNick(nick.GetNick()); |
215 |
|
{ |
216 |
|
Type nicks; |
217 |
|
|
218 |
< |
_foreach (const std::vector<CChan *>, channel, GetUser()->GetChans()) |
218 |
> |
_foreach (const std::vector<CChan *>, chan, GetUser()->GetChans()) |
219 |
|
{ |
220 |
|
typedef std::map<CString, CNick *> NickMap; |
221 |
|
|
222 |
< |
_foreach (const NickMap, nick, (*channel)->GetNicks()) |
222 |
> |
_foreach (const NickMap, nick, (*chan)->GetNicks()) |
223 |
|
{ |
224 |
|
nicks_[nick->first] = true; |
225 |
|
nicks.insert(nick->first); |
241 |
|
{ |
242 |
|
SmartISON *module(static_cast<SmartISON *>(GetModule())); |
243 |
|
|
184 |
– |
if (module->queue_.empty()) |
185 |
– |
{ |
186 |
– |
typedef std::map<CString, bool, SmartISON::Compare> NickMap; |
187 |
– |
|
188 |
– |
_foreach (NickMap, nick, module->nicks_) |
189 |
– |
module->queue_.push_back(nick->first); |
190 |
– |
} |
191 |
– |
|
244 |
|
module->request_.clear(); |
245 |
|
|
246 |
|
std::set<CString, SmartISON::Compare> online(module->CheckChans<std::set<CString, SmartISON::Compare> >()); |
272 |
|
|
273 |
|
module->PutIRC(request); |
274 |
|
} |
275 |
+ |
|
276 |
+ |
if (module->queue_.empty()) |
277 |
+ |
{ |
278 |
+ |
typedef std::map<CString, bool, SmartISON::Compare> NickMap; |
279 |
+ |
|
280 |
+ |
_foreach (NickMap, nick, module->nicks_) |
281 |
+ |
module->queue_.push_back(nick->first); |
282 |
+ |
} |
283 |
|
} |
284 |
|
|
285 |
|
template <> |
313 |
|
if (nick->Equals(prefix, false, prefix.size())) |
314 |
|
{ |
315 |
|
CString modNick(nick->substr(prefix.size())); |
316 |
+ |
CModule *module(NULL); |
317 |
|
|
318 |
< |
if (modNick.Equals("status") || GetUser()->GetModules().FindModule(modNick) || CZNC::Get().GetModules().FindModule(modNick)) |
319 |
< |
goto online; |
318 |
> |
if (modNick.Equals("status") || (module = GetUser()->GetModules().FindModule(modNick)) || (module = CZNC::Get().GetModules().FindModule(modNick))) |
319 |
> |
{ |
320 |
> |
response += (module ? module->GetModNick() : prefix + "status") + " "; |
321 |
> |
continue; |
322 |
> |
} |
323 |
|
} |
324 |
|
|
325 |
< |
if (!nicks_.count(*nick)) |
262 |
< |
queue_.push_front(*nick); |
325 |
> |
std::map<CString, bool, Compare>::iterator theNick(nicks_.find(*nick)); |
326 |
|
|
327 |
< |
if (nicks_[*nick]) |
328 |
< |
online: response += *nick + " "; |
327 |
> |
if (theNick == nicks_.end()) |
328 |
> |
{ |
329 |
> |
nicks_[*nick] = false; |
330 |
> |
|
331 |
> |
queue_.push_front(*nick); |
332 |
> |
} |
333 |
> |
else if (theNick->second) |
334 |
> |
response += theNick->first + " "; |
335 |
|
} |
336 |
|
|
337 |
|
PutUser(response); |