mirror of
https://dev.narayana.im/narayana/telegabber.git
synced 2026-08-05 12:17:06 +00:00
Kick from MUCs instead of unsubscribing in commands
This commit is contained in:
parent
9721e60b0a
commit
65cc9b1551
3 changed files with 52 additions and 40 deletions
|
|
@ -275,11 +275,6 @@ func keyValueString(key, value string) string {
|
||||||
return fmt.Sprintf("%s: %s", key, value)
|
return fmt.Sprintf("%s: %s", key, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) unsubscribe(chatID int64) error {
|
|
||||||
args := gateway.SimplePresence(chatID, "unsubscribed")
|
|
||||||
return c.sendPresence(args...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) usernameOrIDToID(username string) (int64, error) {
|
func (c *Client) usernameOrIDToID(username string) (int64, error) {
|
||||||
userID, err := strconv.ParseInt(username, 10, 64)
|
userID, err := strconv.ParseInt(username, 10, 64)
|
||||||
// couldn't parse the id, try to lookup as a username
|
// couldn't parse the id, try to lookup as a username
|
||||||
|
|
@ -361,7 +356,7 @@ func (c *Client) ProcessTransportCommand(cmdline string, resource string) (strin
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, id := range c.cache.ChatsKeys() {
|
for _, id := range c.cache.ChatsKeys() {
|
||||||
c.unsubscribe(id)
|
c.leaveChat(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Session.Login = ""
|
c.Session.Login = ""
|
||||||
|
|
@ -974,7 +969,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool,
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.unsubscribe(chatID)
|
err = c.leaveChat(chatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
@ -985,7 +980,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool,
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.unsubscribe(chatID)
|
err = c.leaveChat(chatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
@ -1027,7 +1022,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool,
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.unsubscribe(chatID)
|
err = c.leaveChat(chatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
@ -1043,7 +1038,7 @@ func (c *Client) ProcessChatCommand(chatID int64, cmdline string) (string, bool,
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.unsubscribe(chatID)
|
err = c.leaveChat(chatID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error(), true, false
|
return err.Error(), true, false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -236,20 +236,8 @@ func (c *Client) Disconnect(resource string, quit bool) bool {
|
||||||
|
|
||||||
if c.Session.MUC {
|
if c.Session.MUC {
|
||||||
c.locks.mucCacheLock.Lock()
|
c.locks.mucCacheLock.Lock()
|
||||||
var myJid string
|
|
||||||
if c.me != nil {
|
|
||||||
myJid = gateway.CHATJID(c.me.Id, true)
|
|
||||||
}
|
|
||||||
for chatID := range c.mucCache {
|
for chatID := range c.mucCache {
|
||||||
c.sendPresence(
|
c.kickMeFromMUC(chatID, []uint16{110, 332}, false, nil)
|
||||||
gateway.SPFrom(gateway.MUCNODE(chatID)),
|
|
||||||
gateway.SPResource(c.GetMUCNickname(0)),
|
|
||||||
gateway.SPType("unavailable"),
|
|
||||||
gateway.SPMUCAffiliation("none"),
|
|
||||||
gateway.SPMUCRole("none"),
|
|
||||||
gateway.SPMUCJid(myJid),
|
|
||||||
gateway.SPMUCStatusCodes([]uint16{110, 332}),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
c.locks.mucCacheLock.Unlock()
|
c.locks.mucCacheLock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -654,23 +654,7 @@ func (c *Client) DestroyMUC(chatId int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var toResources []string
|
c.kickMeFromMUC(chatId, nil, true, mucState)
|
||||||
for resource := range mucState.Resources {
|
|
||||||
toResources = append(toResources, resource)
|
|
||||||
}
|
|
||||||
var myJid string
|
|
||||||
if c.me != nil {
|
|
||||||
myJid = gateway.CHATJID(c.me.Id, true)
|
|
||||||
}
|
|
||||||
c.sendPresence(
|
|
||||||
gateway.SPFrom(gateway.MUCNODE(chatId)),
|
|
||||||
gateway.SPResource(c.GetMUCNickname(0)),
|
|
||||||
gateway.SPToResources(toResources),
|
|
||||||
gateway.SPMUCAffiliation("none"),
|
|
||||||
gateway.SPMUCRole("none"),
|
|
||||||
gateway.SPMUCJid(myJid),
|
|
||||||
gateway.SPMUCDestroy(""),
|
|
||||||
)
|
|
||||||
|
|
||||||
delete(c.mucCache, chatId)
|
delete(c.mucCache, chatId)
|
||||||
|
|
||||||
|
|
@ -2767,6 +2751,51 @@ func (c *Client) GetChatMembers(chatID int64, limited bool, query string, member
|
||||||
return members, nil
|
return members, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) unsubscribe(chatID int64) error {
|
||||||
|
args := gateway.SimplePresence(chatID, "unsubscribed")
|
||||||
|
return c.sendPresence(args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) leaveChat(chatID int64) error {
|
||||||
|
chat, err := c.GetChatByID(chatID, nil)
|
||||||
|
|
||||||
|
if err == nil && c.Session.MUC && c.IsGroup(chat) {
|
||||||
|
return c.kickMeFromMUC(chatID, []uint16{110, 307}, false, nil)
|
||||||
|
}
|
||||||
|
return c.unsubscribe(chatID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) kickMeFromMUC(chatID int64, statusCodes []uint16, destroy bool, mucState *MUCState) error {
|
||||||
|
var myJid string
|
||||||
|
if c.me != nil {
|
||||||
|
myJid = gateway.CHATJID(c.me.Id, true)
|
||||||
|
}
|
||||||
|
args := []args.V{
|
||||||
|
gateway.SPFrom(gateway.MUCNODE(chatID)),
|
||||||
|
gateway.SPResource(c.GetMUCNickname(0)),
|
||||||
|
gateway.SPMUCAffiliation("none"),
|
||||||
|
gateway.SPMUCRole("none"),
|
||||||
|
gateway.SPMUCJid(myJid),
|
||||||
|
gateway.SPMUCStatusCodes(statusCodes),
|
||||||
|
}
|
||||||
|
if destroy {
|
||||||
|
var toResources []string
|
||||||
|
if mucState != nil {
|
||||||
|
for resource := range mucState.Resources {
|
||||||
|
toResources = append(toResources, resource)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args = append(
|
||||||
|
args,
|
||||||
|
gateway.SPMUCDestroy(""),
|
||||||
|
gateway.SPToResources(toResources),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
args = append(args, gateway.SPType("unavailable"))
|
||||||
|
}
|
||||||
|
return c.sendPresence(args...)
|
||||||
|
}
|
||||||
|
|
||||||
// MigrateToMUCs unsubscribes from legacy group chats and invites to MUCs
|
// MigrateToMUCs unsubscribes from legacy group chats and invites to MUCs
|
||||||
func (c *Client) MigrateToMUCs() {
|
func (c *Client) MigrateToMUCs() {
|
||||||
var chatIDs []int64
|
var chatIDs []int64
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue