support RENAME

closes #4
This commit is contained in:
jesopo 2021-02-16 22:10:10 +00:00
parent 566b8ec8cd
commit 4d14d67d4b
3 changed files with 42 additions and 0 deletions

View File

@ -32,6 +32,12 @@ class Channel(object):
def name_lower(self) -> str:
return self._name.folded
def change_name(self,
normal: str,
folded: str):
self._name.normal = normal
self._name.folded = folded
def add_mode(self,
char: str,
param: Optional[str],

View File

@ -779,6 +779,23 @@ class Server(object):
user.realname = realname
return emit
@line_handler("RENAME")
def _handle_RENAME(self, line: Line) -> Emit:
source_fold = self.casefold(line.params[0])
rename = line.params[1]
rename_fold = self.casefold(rename)
if source_fold in self.channels:
channel = self.channels.pop(source_fold)
channel.change_name(rename, rename_fold)
for nickname in channel.users.keys():
user = self.users[nickname]
user.channels.remove(source_fold)
user.channels.add(rename_fold)
self.channels[rename_fold] = channel
@line_handler(RPL_AWAY)
# sent in response to a command directed at a user who is marked as away
def _handle_RPL_AWAY(self, line: Line) -> Emit:

View File

@ -162,3 +162,22 @@ class ChannelNICKAfterJoin(unittest.TestCase):
self.assertEqual(channel.users, {user.nickname_lower: channel_user})
self.assertEqual(channel_user.nickname, "Nickname2")
self.assertEqual(channel_user.nickname_lower, "nickname2")
class ChannelRENAME(unittest.TestCase):
def test(self):
server = ircstates.Server("test")
server.parse_tokens(irctokens.tokenise("001 nickname *"))
server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan"))
server.parse_tokens(irctokens.tokenise(":other JOIN #chan"))
user = server.users["nickname"]
channel = server.channels["#chan"]
server.parse_tokens(irctokens.tokenise(":nickname RENAME #chan #chan2 *"))
self.assertEqual(channel.name, "#chan2")
self.assertEqual(set(channel.users.keys()), {"nickname", "other"})
self.assertEqual(user.channels, {"#chan2"})
self.assertNotIn("#chan", server.channels)
self.assertIn("#chan2", server.channels)
self.assertEqual(len(server.channels), 1)