kick: route KICK of a remote channel member to its server and drop the local view
This commit is contained in:
parent
68b80c3f82
commit
262699bf30
1 changed files with 27 additions and 0 deletions
|
|
@ -503,6 +503,33 @@ impl Command for Kick {
|
|||
return CmdResult::Fail;
|
||||
}
|
||||
let Some(tuid) = s.find_nick(victim) else {
|
||||
// remote victim: route the kick to its server and drop our view of it
|
||||
if let Some((vuuid, _)) = s.find_remote(victim) {
|
||||
if s.channels[&key].rmembers.contains_key(&vuuid) {
|
||||
if s.nick_servprotected(victim) {
|
||||
s.numeric(
|
||||
uid,
|
||||
ERR_CHANOPRIVSNEEDED,
|
||||
&format!("{chan} :You cannot kick a network service"),
|
||||
);
|
||||
return CmdResult::Fail;
|
||||
}
|
||||
let kicker = s.users[&uid].nick.clone();
|
||||
let reason = params.get(2).cloned().unwrap_or(kicker);
|
||||
let prefix = s.users[&uid].prefix();
|
||||
let vnick = s
|
||||
.remote_users
|
||||
.get(&vuuid)
|
||||
.map(|r| r.nick.clone())
|
||||
.unwrap_or_else(|| victim.to_string());
|
||||
s.to_channel(&key, &format!(":{prefix} KICK {chan} {vnick} :{reason}"), None);
|
||||
s.propagate_kick(uid, chan, victim, &reason);
|
||||
if let Some(ch) = s.channels.get_mut(&key) {
|
||||
ch.rmembers.remove(&vuuid);
|
||||
}
|
||||
return CmdResult::Ok;
|
||||
}
|
||||
}
|
||||
s.numeric(
|
||||
uid,
|
||||
ERR_NOSUCHNICK,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue