Add per-chat nick setting, update README.md
This commit is contained in:
15
README.md
15
README.md
@@ -7,14 +7,15 @@
|
|||||||
|
|
||||||
## Что он может?
|
## Что он может?
|
||||||
|
|
||||||
Имеет возможность соединяться с сервером по протоколу xmpp как с шифрованием, так и без. (Пока что) Шифрование
|
* Имеет возможность соединяться с сервером по протоколу xmpp как с шифрованием, так и без. (Пока что) Шифрование
|
||||||
работает по классическим механикам (шифрованный канал связи, без возможности коммуникации в незашифрованном виде),
|
работает по классическим механикам (шифрованный канал связи, без возможности коммуникации в незашифрованном виде),
|
||||||
без поддержки механизма start tls. Что-то в гошке или на стороне сервера при выборе StartTLS не работает.
|
без поддержки механизма start tls. (Что-то в гошке или на стороне сервера при выборе StartTLS не работает.)
|
||||||
|
* Имеет возможность заносить пользователей в бан-лист, согласно заданным в чёрном списке правилам:
|
||||||
Имеет возможность заносить пользователей в бан-лист, согласно заданным в чёрном списке правилам: по совпадению с
|
- по совпадению с регулярными выражениями в nick-е или jid-е злодея
|
||||||
регулярными выражениями в nick-е или jid-е злодея, а также по регулярным выражениям характерных фраз. Правила можно
|
- по регулярным выражениям характерных фраз.
|
||||||
настроить как глобально, для всех комнат, где присутствует бот, так и для каждой комнаты отдельно. При изменении списка
|
- Правила можно настроить как глобально, для всех комнат, где присутствует бот, так и для каждой комнаты отдельно.
|
||||||
правил бота не надо перезапускать, достаточно отдать ему команду rehash либо в приват, либо прям в чатике.
|
- При изменении списка правил бота не надо перезапускать, достаточно отдать ему команду rehash либо в приват, либо прям в чатике.
|
||||||
|
* Есть настройка заходить в разные комнаты под разными никами
|
||||||
|
|
||||||
## Что он не может?
|
## Что он не может?
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"room_name": "",
|
"room_name": "",
|
||||||
|
|
||||||
# Записывать ли в reason в банлисте комнаты сообщение вида autoban at yyyy.MM.dd hh:mm:ss.
|
# Записывать ли в reason в банлисте комнаты сообщение вида autoban at yyyy.MM.dd hh:mm:ss.
|
||||||
# Если не задано, то false
|
# Если не задано, то false.
|
||||||
"reason_enable": false,
|
"reason_enable": false,
|
||||||
|
|
||||||
# Список регулярок JID-ов, которых надо банить.
|
# Список регулярок JID-ов, которых надо банить.
|
||||||
|
|||||||
@@ -71,6 +71,10 @@
|
|||||||
# Название канала, обязательное поле
|
# Название канала, обязательное поле
|
||||||
"name" : "my_channel@conference.jabber.tld",
|
"name" : "my_channel@conference.jabber.tld",
|
||||||
|
|
||||||
|
# Под каким ником бот зайдёт конкретно на этот канал. Если не задано, будет использован ник, заданный в
|
||||||
|
# общих настройках Jabber, выше по конфигу.
|
||||||
|
"nick" : "sailormoon",
|
||||||
|
|
||||||
# Настройки байесовского классификатора. В виду вероятности ложного срабатывания возможно, имеет смысл
|
# Настройки байесовского классификатора. В виду вероятности ложного срабатывания возможно, имеет смысл
|
||||||
# воздержаться от использования. Зависит от использования и от словарей.
|
# воздержаться от использования. Зависит от использования и от словарей.
|
||||||
"bayes": {
|
"bayes": {
|
||||||
|
|||||||
@@ -33,11 +33,14 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
|
|
||||||
// Групповой чятик
|
// Групповой чятик
|
||||||
case "groupchat":
|
case "groupchat":
|
||||||
log.Debugf("Message from public chat: %s", v.Text)
|
var (
|
||||||
// room := strings.SplitN(v.Remote, "/", 2)[0]
|
room = strings.SplitN(v.Remote, "/", 2)[0]
|
||||||
nick := strings.SplitN(v.Remote, "/", 2)[1]
|
nick = strings.SplitN(v.Remote, "/", 2)[1]
|
||||||
|
)
|
||||||
|
|
||||||
if nick == config.Jabber.Nick {
|
log.Debugf("Message from public chat: %s", v.Text)
|
||||||
|
|
||||||
|
if nick == getBotNickFromRoomConfig(room) {
|
||||||
log.Debug("Skipping message from myself")
|
log.Debug("Skipping message from myself")
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -361,7 +364,7 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
mucNickMatch := false
|
mucNickMatch := false
|
||||||
|
|
||||||
for _, room := range roomsConnected {
|
for _, room := range roomsConnected {
|
||||||
mucNick := fmt.Sprintf("%s/%s", room, config.Jabber.Nick)
|
mucNick := fmt.Sprintf("%s/%s", room, getBotNickFromRoomConfig(room))
|
||||||
|
|
||||||
if v.From == mucNick {
|
if v.From == mucNick {
|
||||||
mucNickMatch = true
|
mucNickMatch = true
|
||||||
@@ -384,7 +387,7 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
mucNickMatch := false
|
mucNickMatch := false
|
||||||
|
|
||||||
for _, room := range roomsConnected {
|
for _, room := range roomsConnected {
|
||||||
mucNick := fmt.Sprintf("%s/%s", room, config.Jabber.Nick)
|
mucNick := fmt.Sprintf("%s/%s", room, getBotNickFromRoomConfig(room))
|
||||||
|
|
||||||
if v.From == mucNick {
|
if v.From == mucNick {
|
||||||
mucNickMatch = true
|
mucNickMatch = true
|
||||||
@@ -484,8 +487,11 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
if err := xml.Unmarshal(v.Query, &iqErrorCancelNotAcceptable); err == nil {
|
if err := xml.Unmarshal(v.Query, &iqErrorCancelNotAcceptable); err == nil {
|
||||||
if v.To == talk.JID() {
|
if v.To == talk.JID() {
|
||||||
nick := strings.SplitN(v.From, "/", 2)[1]
|
nick := strings.SplitN(v.From, "/", 2)[1]
|
||||||
|
room := strings.SplitN(v.From, "/", 2)[0]
|
||||||
|
|
||||||
|
if slices.Contains(roomsConnected, iqErrorCancelNotAcceptable.By) &&
|
||||||
|
nick == getBotNickFromRoomConfig(room) {
|
||||||
|
|
||||||
if slices.Contains(roomsConnected, iqErrorCancelNotAcceptable.By) && nick == config.Jabber.Nick {
|
|
||||||
log.Errorf(
|
log.Errorf(
|
||||||
"Got Iq error message from: %s to: %s. Looks like i'm not in MUC anymore",
|
"Got Iq error message from: %s to: %s. Looks like i'm not in MUC anymore",
|
||||||
v.From, v.To,
|
v.From, v.To,
|
||||||
@@ -577,7 +583,7 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
|
|
||||||
// Это наш собственный Presence
|
// Это наш собственный Presence
|
||||||
if v.Show == "" && v.Status == "" {
|
if v.Show == "" && v.Status == "" {
|
||||||
if nick == config.Jabber.Nick {
|
if nick == getBotNickFromRoomConfig(room) {
|
||||||
roomsConnected = append(roomsConnected, room)
|
roomsConnected = append(roomsConnected, room)
|
||||||
// На всякий случай дедуплицируем список комнат, к которым мы заджойнились.
|
// На всякий случай дедуплицируем список комнат, к которым мы заджойнились.
|
||||||
sort.Strings(roomsConnected)
|
sort.Strings(roomsConnected)
|
||||||
|
|||||||
16
lib.go
16
lib.go
@@ -355,7 +355,8 @@ func joinMuc(room string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := talk.JoinMUCNoHistory(room, config.Jabber.Nick); err != nil {
|
// Заходим в конфу, наконец-то
|
||||||
|
if _, err := talk.JoinMUCNoHistory(room, getBotNickFromRoomConfig(room)); err != nil {
|
||||||
log.Errorf("Unable to join to MUC: %s", room)
|
log.Errorf("Unable to join to MUC: %s", room)
|
||||||
|
|
||||||
gTomb.Kill(err)
|
gTomb.Kill(err)
|
||||||
@@ -551,14 +552,13 @@ func probeMUCLiveness() { //nolint:gocognit
|
|||||||
sleepTime := time.Duration(rand.Int63n(1000*config.Jabber.PingSplayDelay)) * time.Millisecond //nolint:gosec
|
sleepTime := time.Duration(rand.Int63n(1000*config.Jabber.PingSplayDelay)) * time.Millisecond //nolint:gosec
|
||||||
time.Sleep(sleepTime)
|
time.Sleep(sleepTime)
|
||||||
|
|
||||||
if err := talk.PingS2S(talk.JID(), room+"/"+config.Jabber.Nick); err != nil {
|
if err := talk.PingS2S(talk.JID(), room+"/"+getBotNickFromRoomConfig(room)); err != nil {
|
||||||
gTomb.Kill(err)
|
gTomb.Kill(err)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}(room)
|
}(room)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var roomMap interface{}
|
var roomMap interface{}
|
||||||
|
|
||||||
roomMap, exist = mucCapsList.Get(room)
|
roomMap, exist = mucCapsList.Get(room)
|
||||||
@@ -697,4 +697,14 @@ func getRealJIDfromNick(fullNick string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getBotNickFromRoomConfig(room string) string {
|
||||||
|
for _, roomStruct := range config.Jabber.Channels {
|
||||||
|
if roomStruct.Name == room {
|
||||||
|
return roomStruct.Nick
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config.Jabber.Nick
|
||||||
|
}
|
||||||
|
|
||||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||||
|
|||||||
@@ -187,11 +187,15 @@ func readConfig() error { //nolint:gocognit,gocyclo
|
|||||||
return errors.New("no jabber channels/rooms defined in config, quitting") //nolint:goerr113
|
return errors.New("no jabber channels/rooms defined in config, quitting") //nolint:goerr113
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, channel := range sampleConfig.Jabber.Channels {
|
for n, channel := range sampleConfig.Jabber.Channels {
|
||||||
if channel.Name == "" {
|
if channel.Name == "" {
|
||||||
return errors.New("no \"name\" entry in jabber channel config")
|
return errors.New("no \"name\" entry in jabber channel config")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if channel.Nick == "" {
|
||||||
|
sampleConfig.Jabber.Channels[n].Nick = sampleConfig.Jabber.Nick
|
||||||
|
}
|
||||||
|
|
||||||
// channel.Password может быть пустым, тогда пароля нет
|
// channel.Password может быть пустым, тогда пароля нет
|
||||||
// channel.Bayes.Enabled будет false, если не проставлен
|
// channel.Bayes.Enabled будет false, если не проставлен
|
||||||
|
|
||||||
@@ -260,6 +264,7 @@ func readConfig() error { //nolint:gocognit,gocyclo
|
|||||||
|
|
||||||
config = sampleConfig
|
config = sampleConfig
|
||||||
configLoaded = true
|
configLoaded = true
|
||||||
|
|
||||||
log.Infof("Using %s as config file", location) //nolint:wsl
|
log.Infof("Using %s as config file", location) //nolint:wsl
|
||||||
|
|
||||||
break
|
break
|
||||||
|
|||||||
1
types.go
1
types.go
@@ -26,6 +26,7 @@ type myConfig struct {
|
|||||||
BotMasters []string `json:"bot_masters,omitempty"`
|
BotMasters []string `json:"bot_masters,omitempty"`
|
||||||
Channels []struct {
|
Channels []struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
|
Nick string `json:"nick,omitempty"`
|
||||||
Password string `json:"password,omitempty"`
|
Password string `json:"password,omitempty"`
|
||||||
Bayes struct {
|
Bayes struct {
|
||||||
Enabled bool `json:"enabled,omitempty"`
|
Enabled bool `json:"enabled,omitempty"`
|
||||||
|
|||||||
Reference in New Issue
Block a user