示例#1
0
    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
示例#2
0
文件: channel.py 项目: MrSwiss/charla
    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
示例#3
0
    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))
示例#4
0
文件: ircd.py 项目: ke4roh/circuits
    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))
示例#5
0
    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))
示例#6
0
文件: ircd.py 项目: ke4roh/circuits
    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
示例#7
0
    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
示例#8
0
文件: ircd.py 项目: ke4roh/circuits
    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"))
示例#9
0
文件: ircd.py 项目: xmonader/circuits
    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"))
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
    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()
示例#14
0
    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]
示例#15
0
文件: ircd.py 项目: ke4roh/circuits
    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]
示例#16
0
文件: admin.py 项目: MrSwiss/charla
    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)
示例#17
0
 def signon(self, sock, source):
     # Force users to join #circuits
     self.fire(response.create("join", sock, source, u("#circuits")))