package jabber import ( "encoding/xml" "os" "github.com/eleksir/go-xmpp" "gopkg.in/tomb.v2" ) type ( // MyConfig прототип структурки с конфигом. MyConfig struct { CSign string `json:"csign,omitempty"` Loglevel string `json:"loglevel,omitempty"` Log string `json:"log,omitempty"` Version string `json:"version,omitempty"` ExeName string `json:"exe_name,omitempty"` Jabber struct { Server string `json:"server,omitempty"` Nick string `json:"nick,omitempty"` Resource string `json:"resource,omitempty"` User string `json:"user,omitempty"` Password string `json:"password,omitempty"` StartupStatus []string `json:"startup_status,omitempty"` BotMasters []string `json:"bot_masters,omitempty"` BanPhrases []string `json:"ban_phrases,omitempty"` RuntimeStatus struct { Text []string `json:"text,omitempty"` RotationTime int64 `json:"rotation_time,omitempty"` RotationSplayTime int64 `json:"rotation_splay_time,omitempty"` } `json:"runtime_status"` Channels []struct { Name string `json:"name,omitempty"` Nick string `json:"nick,omitempty"` Password string `json:"password,omitempty"` AllCaps struct { DefaultAction string `json:"default_action,omitempty"` MinLength int `json:"min_length,omitempty"` Enabled bool `json:"enabled,omitempty"` } `json:"all_caps"` Bayes struct { DefaultAction string `json:"default_action,omitempty"` MinWords int64 `json:"min_words,omitempty"` MinLength int `json:"min_length,omitempty"` Enabled bool `json:"enabled,omitempty"` } `json:"bayes"` } `json:"channels"` ConnectionTimeout int64 `json:"connection_timeout,omitempty"` ReconnectDelay int64 `json:"reconnect_delay,omitempty"` ServerPingDelay int64 `json:"server_ping_delay,omitempty"` MucPingDelay int64 `json:"muc_ping_delay,omitempty"` MucRejoinDelay int64 `json:"muc_rejoin_delay,omitempty"` PingSplayDelay int64 `json:"ping_splay_delay,omitempty"` BanDelay int64 `json:"ban_delay,omitempty"` Port int `json:"port,omitempty"` Ssl bool `json:"ssl,omitempty"` StartTLS bool `json:"starttls,omitempty"` SslVerify bool `json:"ssl_verify,omitempty"` InsecureAllowUnencryptedAuth bool `json:"insecureallowunencryptedauth,omitempty"` BanPhrasesEnable bool `json:"ban_phrases_enable,omitempty"` } `json:"jabber"` } // MyWhiteList прототип структурки с белым списком jid-ов. MyWhiteList struct { Whitelist []struct { RoomName string `json:"room_name,omitempty"` Jid []string `json:"jid,omitempty"` WipeBans bool `json:"wipe_bans,omitempty"` } `json:"whitelist,omitempty"` } // MyBlackList прототип структурки с чёрным списком jid-ов. MyBlackList struct { Blacklist []struct { RoomName string `json:"room_name,omitempty"` JidRe []string `json:"jid_re,omitempty"` NickRe []string `json:"nick_re,omitempty"` PhraseRe []string `json:"phrase_re,omitempty"` UserAgent []struct { Name string `json:"name,omitempty"` Version string `json:"version,omitempty"` Os string `json:"os,omitempty"` } `json:"user_agent"` ReasonEnable bool `json:"reason_enable,omitempty"` } `json:"blacklist"` } // Jabber основная структура-объект, содержащая стейты и проч. Jabber struct { // C - конфиг, как он распарсился из конфиг-файла. C MyConfig // WhiteList - структурка с безусловно разрешёнными jid-ами. WhiteList MyWhiteList // BlackList - структурка с запрещёнными по регуляркам фразами, никами, jid-ами. BlackList MyBlackList // Опции подключения к xmpp-серверу. Options *xmpp.Options // gTomb пул активных горутин. GTomb tomb.Tomb // Talk основная структурка xmpp-клиента. Talk *xmpp.Client // sync.Map-ка с капабилити сервера. ServerCapsList *Collection // ServerCapsQueried показывает, были ли запрошены capabilities сервера. ServerCapsQueried bool // Время последней активности, нужно для c2s пингов - посылаем пинги, только если давненько ничего не приходило с // сервера. LastServerActivity int64 // Время, когда был отправлен c2s ping. ServerPingTimestampTx int64 // Время, когда был принят s2c pong. ServerPingTimestampRx int64 // Время последней активности, нужно для jabber:iq:last. LastActivity int64 // sync.Map-ка с комнатами и их capability. MucCapsList *Collection // Время последней активности MUC-ов, нужно для пингов - посылаем пинги, только если давненько ничего не приходило из // muc-ов. LastMucActivity *Collection // Список комнат, в которых находится бот. RoomsConnected []string // sync.Map-ка со списком участников конференций (в json-формате, согласно структуре xmpp.Presence, "room".[]json). RoomPresences *Collection // Канал, по котором приходят сообщения о том, что ОС отправила некие сигналы процессу. SigChan chan os.Signal // Индиктор того, что процесс завершается. Shutdown bool // Индиктор того, что соединение установлено. IsConnected bool // Индикатор того, что соединение в процессе достукивания до сервера. Connecting bool } // SimpleIqGetQuery прототип структурки для разбора запросов xmpp discovery query, например, // https://xmpp.org/extensions/xep-0030.html#example-18 . SimpleIqGetQuery struct { XMLName xml.Name `xml:"query"` Text string `xml:",chardata"` Xmlns string `xml:"xmlns,attr"` Node string `xml:"node,attr,omitempty"` // для xmlns="http://jabber.org/protocol/disco#items" } // PubsubIQGetQuery прототип структурки для разбора запросов xmpp pubsub. PubsubIQGetQuery struct { XMLName xml.Name `xml:"pubsub"` Text string `xml:",chardata"` Xmlns string `xml:"xmlns,attr"` Items struct { Text string `xml:",chardata"` Node string `xml:"node,attr"` MaxItems string `xml:"max_items,attr"` } `xml:"items"` } // TimeIqGetQuery прототип структурки для разбора IQ запросов на локальное время клиента, // https://xmpp.org/extensions/xep-0202.html TimeIqGetQuery struct { //