Fix filling presence db, fix ban by useragent
This commit is contained in:
@@ -45,23 +45,30 @@ func InterfaceToStringSlice(iface any) []string {
|
||||
// GetRealJIDfromNick достаёт из запомненных presence-ов по даденному nick-у real jid с resource-ом. Nick должен
|
||||
// содержать имя конфы, откуда участник.
|
||||
func (j *Jabber) GetRealJIDfromNick(fullNick string) string {
|
||||
var p xmpp.Presence
|
||||
var (
|
||||
presenceJSON []byte
|
||||
ok bool
|
||||
presences []xmpp.Presence
|
||||
)
|
||||
|
||||
room := (strings.SplitN(fullNick, "/", 2))[0]
|
||||
|
||||
// Достанем presence участника.
|
||||
presenceJSONInterface, present := j.RoomPresences.Get(room)
|
||||
if presenceJSONInterface, present := j.RoomPresences.Get(room); present {
|
||||
presenceJSON, ok = presenceJSONInterface.([]byte)
|
||||
if !ok {
|
||||
log.Errorf("Looks like we have corrupted entry in presence db")
|
||||
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(presenceJSON, &presences); err != nil {
|
||||
log.Errorf("Looks like we have corrupted entry in presence db")
|
||||
|
||||
// Никого нет дома.
|
||||
if !present {
|
||||
return ""
|
||||
}
|
||||
|
||||
presenceJSONStrings := InterfaceToStringSlice(presenceJSONInterface)
|
||||
|
||||
for _, presepresenceJSONString := range presenceJSONStrings {
|
||||
_ = json.Unmarshal([]byte(presepresenceJSONString), &p)
|
||||
|
||||
for _, p := range presences { //nolint: gocritic // Развели тут, блять, страну советов, напиши что надо сделать кодом, сука.
|
||||
if p.From == fullNick {
|
||||
return p.JID
|
||||
}
|
||||
@@ -191,17 +198,29 @@ func (j *Jabber) JoinMuc(room string) error {
|
||||
j.GTomb.Go(func() error { return j.RotateStatus(room) })
|
||||
|
||||
// Время проверить участников на предмет злобности.
|
||||
namesInterface, present := j.RoomPresences.Get(room)
|
||||
presenceJSONInterface, present := j.RoomPresences.Get(room)
|
||||
|
||||
// Если room есть в списке presence-ов, то фигачим. room там должен быть, просто обязан.
|
||||
if present {
|
||||
for _, name := range InterfaceToStringSlice(namesInterface) {
|
||||
var v xmpp.Presence
|
||||
presenceJSON, ok := presenceJSONInterface.([]byte)
|
||||
|
||||
_ = json.Unmarshal([]byte(name), &v)
|
||||
log.Infof("Fake presence forged for %s just for on-enter check", v.JID)
|
||||
if !ok {
|
||||
log.Errorf("Looks like we have corrupted entry in presence db")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var presences []xmpp.Presence
|
||||
|
||||
if err := json.Unmarshal(presenceJSON, &presences); err != nil {
|
||||
log.Errorf("Looks like we have corrupted entry in presence db")
|
||||
|
||||
return nil //nolint: nilerr // If presence db is corrupted it is a bad thing, but we log it anyway.
|
||||
}
|
||||
|
||||
for _, p := range presences { //nolint: gocritic // Развели тут, блять, страну советов, напиши что надо сделать кодом, сука.
|
||||
log.Infof("Fake presence forged for %s just for on-enter check", p.JID)
|
||||
// Оно там внутри всё само обработает, если вдруг возникнет wire error, то зарекконетится.
|
||||
_ = j.BunyPresense(v)
|
||||
_ = j.BunyPresense(p)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user