def _join(self, sock, source, name): user = models.User.objects.filter(sock=sock).first() if name and name[0] not in self.parent.chantypes: return ERR_NOSUCHCHANNEL(name) if VALID_CHANNEL_REGEX.match(name) is None: return ERR_NOSUCHCHANNEL(name) if len(name) > self.parent.channellen: return ERR_NOSUCHCHANNEL(name) replies = [JOIN(name, prefix=user.prefix)] channel = models.Channel.objects.filter(name=name).first() if channel is None: channel = models.Channel(name=name) channel.save() if user in channel.users: return type = name[0] nchannels = len([x for x in user.channels if channel.type == type]) chanlimit = self.parent.chanlimit.get(type, None) if chanlimit and nchannels >= chanlimit: return ERR_TOOMANYCHANNELS(name) self.notify(channel.users[:], JOIN(name, prefix=user.prefix)) user.channels.append(channel) user.save() if not channel.users: replies.append( MODE(name, u"+o {0}".format(user.nick), prefix=self.server.host)) channel.operators.append(user) channel.save() channel.users.append(user) channel.save() self.fire( response.create("topic", sock, source, channel.name, joined=True), "server") self.fire(response.create("names", sock, source, channel.name), "server") return replies
def _join(self, sock, source, name): user = models.User.objects.filter(sock=sock).first() if name and name[0] not in self.parent.chantypes: return ERR_NOSUCHCHANNEL(name) if VALID_CHANNEL_REGEX.match(name) is None: return ERR_NOSUCHCHANNEL(name) if len(name) > self.parent.channellen: return ERR_NOSUCHCHANNEL(name) replies = [JOIN(name, prefix=user.prefix)] channel = models.Channel.objects.filter(name=name).first() if channel is None: channel = models.Channel(name=name) channel.save() if user in channel.users: return type = name[0] nchannels = len([x for x in user.channels if channel.type == type]) chanlimit = self.parent.chanlimit.get(type, None) if chanlimit and nchannels >= chanlimit: return ERR_TOOMANYCHANNELS(name) self.notify( channel.users[:], JOIN(name, prefix=user.prefix) ) user.channels.append(channel) user.save() if not channel.users: replies.append(MODE(name, u("+o {0}").format(user.nick), prefix=self.server.host)) channel.operators.append(user) channel.save() channel.users.append(user) channel.save() self.fire(response.create("topic", sock, source, channel.name, joined=True), "server") self.fire(response.create("names", sock, source, channel.name), "server") return replies
def signon(self, sock, source): version = u"{0}-{1}".format(self.server.name, self.server.version) umodes = u"".join(user_modes.keys()) chmodes = u"".join(channel_modes.keys()) self.fire(reply(sock, RPL_WELCOME(self.server.network))) self.fire(reply(sock, RPL_YOURHOST(self.server.host, version))) self.fire(reply(sock, RPL_CREATED(self.server.created))) self.fire(reply(sock, RPL_MYINFO(self.server.host, version, umodes, chmodes))) result = yield self.call(supports()) self.fire(reply(sock, RPL_ISUPPORT(tuple(chain(*result.value))))) self.fire(response.create("lusers", sock, source)) self.fire(response.create("motd", sock, source))
def user(self, sock, source, nick, user, host, name): _user = self.users[sock] _user.userinfo.user = user _user.userinfo.host = host _user.userinfo.name = name if _user.nick is not None: _user.registered = True self.fire(response.create("signon", sock, source))
def nick(self, sock, source, nick): user = self.users[sock] if nick in self.nicks: return self.fire(reply(sock, ERR_NICKNAMEINUSE(nick))) if not user.registered: user.registered = True self.fire(response.create("signon", sock, user)) user.nick = nick self.nicks[nick] = user
def signon(self, sock, source): user = self.users[sock] if user.signon: return user.signon = time() self.fire(reply(sock, RPL_WELCOME(self.network))) self.fire(reply(sock, RPL_YOURHOST(self.host, self.version))) self.fire(reply(sock, ERR_NOMOTD())) # Force users to join #circuits self.fire(response.create("join", sock, source, "#circuits"))
def disconnect(self, sock): user = User.objects.filter(sock=sock).first() if user is None: return nick = user.nick user, host = user.userinfo.user, user.userinfo.host quit = response.create("quit", sock, (nick, user, host), u("Leaving")) quit.complete = True quit.complete_channels = ("server",) self.fire(quit)
def disconnect(self, sock): user = User.objects.filter(sock=sock).first() if user is None: return nick = user.nick user, host = user.userinfo.user, user.userinfo.host quit = response.create("quit", sock, (nick, user, host), "Leavling") quit.complete = True quit.complete_channels = ("server", ) self.fire(quit)
def kill(self, sock, source, target, reason=None): user = User.objects.filter(sock=sock).first() if not user.oper: return ERR_NOPRIVILEGES() nick = User.objects.filter(nick=target).first() if nick is None: return ERR_NOSUCHNICK(target) reason = u("Killed by {0}: {1}").format(user.nick, reason or nick.nick) self.fire(response.create("quit", nick.sock, nick.source, reason, disconnect=False)) self.fire(reply(nick.sock, ERROR(nick.host, reason)), "server") Timer(1, close(nick.sock), "server").register(self)
def poll(self): now = int(time()) reason = u("Ping timeout: {0} seconds") for user in User.objects.all(): if user.lastping and not user.lastpong and ((now - user.lastping) > self.timeout): delta = now - user.lastping self.fire(response.create("quit", user.sock, user.source, reason.format(delta))) self.fire(reply(user.sock, ERROR(user.host, reason.format(delta))), "server") Timer(1, close(user.sock), "server").register(self) else: self.fire(write(user.sock, bytes(PING(self.server.host)))) user.lastping = int(time()) user.lastpong = None user.save()
def disconnect(self, sock): if sock not in self.users: return user = self.users[sock] self.logger.info("D: [{0:s}:{1:d}]".format(user.host, user.port)) nick = user.nick user, host = user.userinfo.user, user.userinfo.host yield self.call( response.create("quit", sock, (nick, user, host), "Leaving")) del self.users[sock] if nick in self.nicks: del self.nicks[nick]
def disconnect(self, sock): if sock not in self.users: return user = self.users[sock] self.logger.info("D: [{0:s}:{1:d}]".format(user.host, user.port)) nick = user.nick user, host = user.userinfo.user, user.userinfo.host yield self.call( response.create("quit", sock, (nick, user, host), "Leavling") ) del self.users[sock] if nick in self.nicks: del self.nicks[nick]
def kill(self, sock, source, target, reason=None): user = User.objects.filter(sock=sock).first() if not user.oper: return ERR_NOPRIVILEGES() nick = User.objects.filter(nick=target).first() if nick is None: return ERR_NOSUCHNICK(target) reason = u("Killed: {0}").format(reason) if reason else nick.nick self.fire( response.create("quit", nick.sock, nick.source, reason, disconnect=False)) self.fire(reply(nick.sock, ERROR(reason)), "server") Timer(1, close(nick.sock), "server").register(self)
def signon(self, sock, source): # Force users to join #circuits self.fire(response.create("join", sock, source, u("#circuits")))