2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org>
5 * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
6 * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
7 * Copyright (C) 2007 Craig Edwards <craigedwards@brainbox.cc>
9 * This file is part of InspIRCd. InspIRCd is free software: you can
10 * redistribute it and/or modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation, version 2.
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 static void JoinChannels(LocalUser* u, const std::string& chanlist)
27 irc::commasepstream chans(chanlist);
30 while (chans.GetToken(chan))
32 if (ServerInstance->IsChannel(chan))
33 Channel::JoinUser(u, chan);
37 class JoinTimer : public Timer
40 LocalUser* const user;
41 const std::string channels;
42 SimpleExtItem<JoinTimer>& ext;
45 JoinTimer(LocalUser* u, SimpleExtItem<JoinTimer>& ex, const std::string& chans, unsigned int delay)
47 , user(u), channels(chans), ext(ex)
49 ServerInstance->Timers.AddTimer(this);
52 bool Tick(time_t time) CXX11_OVERRIDE
54 if (user->chans.empty())
55 JoinChannels(user, channels);
62 class ModuleConnJoin : public Module
64 SimpleExtItem<JoinTimer> ext;
66 unsigned int defdelay;
70 : ext("join_timer", ExtensionItem::EXT_USER, this)
74 void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
76 ConfigTag* tag = ServerInstance->Config->ConfValue("autojoin");
77 defchans = tag->getString("channel");
78 defdelay = tag->getDuration("delay", 0, 0, 60*15);
81 void Prioritize() CXX11_OVERRIDE
83 ServerInstance->Modules->SetPriority(this, I_OnPostConnect, PRIORITY_LAST);
86 Version GetVersion() CXX11_OVERRIDE
88 return Version("Forces users to join the specified channel(s) on connect", VF_VENDOR);
91 void OnPostConnect(User* user) CXX11_OVERRIDE
93 LocalUser* localuser = IS_LOCAL(user);
97 std::string chanlist = localuser->GetClass()->config->getString("autojoin");
98 unsigned int chandelay = localuser->GetClass()->config->getDuration("autojoindelay", 0, 0, 60*15);
100 if (chanlist.empty())
102 if (defchans.empty())
105 chandelay = defdelay;
109 JoinChannels(localuser, chanlist);
111 ext.set(localuser, new JoinTimer(localuser, ext, chanlist, chandelay));
115 MODULE_INIT(ModuleConnJoin)