Config format changed, add per-chat nick setting
This commit is contained in:
@@ -60,7 +60,7 @@ func cmd(v xmpp.Chat) error {
|
|||||||
message.Misc.Fwdcnt = 0
|
message.Misc.Fwdcnt = 0
|
||||||
message.Misc.Csign = config.CSign
|
message.Misc.Csign = config.CSign
|
||||||
message.Misc.Username = userNick
|
message.Misc.Username = userNick
|
||||||
message.Misc.Botnick = config.Jabber.Nick
|
message.Misc.Botnick = getBotNickFromRoomConfig(message.Chatid)
|
||||||
message.Misc.Msgformat = 0
|
message.Misc.Msgformat = 0
|
||||||
|
|
||||||
msgLen := len(v.Text)
|
msgLen := len(v.Text)
|
||||||
@@ -323,7 +323,9 @@ func cmd(v xmpp.Chat) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Предполагается что в канале бот должен отвечать, только если к нему обратились, либо это была команда
|
// Предполагается что в канале бот должен отвечать, только если к нему обратились, либо это была команда
|
||||||
if regexp.MustCompile(config.Jabber.Nick).Match([]byte(message.Message)) {
|
botNick := getBotNickFromRoomConfig(message.Chatid)
|
||||||
|
|
||||||
|
if regexp.MustCompile(regexp.QuoteMeta(botNick)).Match([]byte(message.Message)) {
|
||||||
message.Misc.Answer = 1
|
message.Misc.Answer = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,8 +79,20 @@
|
|||||||
|
|
||||||
# Jabber-каналы, к которым бот попробует присоединиться при старте
|
# Jabber-каналы, к которым бот попробует присоединиться при старте
|
||||||
"channels": [
|
"channels": [
|
||||||
"my_channel@conference.jabber.tld",
|
{
|
||||||
"another_channel@conference.jabber.tld"
|
# Название чатрума/конференции
|
||||||
|
"name": "my_channel@conference.jabber.tld",
|
||||||
|
|
||||||
|
# Под каким ником бот зайдёт конкретно на этот канал. Если не задано, будет использован ник, заданный в
|
||||||
|
# общих настройках Jabber, выше по конфигу.
|
||||||
|
"nick": "alice",
|
||||||
|
|
||||||
|
# Пароль, если не задан или пустой, то заход в комнату будет без пароля. (не реализовано)
|
||||||
|
"password": "secret"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "another_channel@conference.jabber.tld"
|
||||||
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
# Статус, с которым бот запускается. (если всё нормально, этот статус будет видать только в логах сервера и
|
# Статус, с которым бот запускается. (если всё нормально, этот статус будет видать только в логах сервера и
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ func parseEvent(e interface{}) { //nolint:maintidx,gocognit,gocyclo
|
|||||||
// Групповой чятик
|
// Групповой чятик
|
||||||
case "groupchat":
|
case "groupchat":
|
||||||
log.Debugf("Message from public chat: %s", v.Text)
|
log.Debugf("Message from public chat: %s", v.Text)
|
||||||
// dest := 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 {
|
if nick == getBotNickFromRoomConfig(room) {
|
||||||
log.Debug("Skipping message from myself")
|
log.Debug("Skipping message from myself")
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -354,7 +354,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
|
||||||
@@ -438,9 +438,12 @@ 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]
|
var (
|
||||||
|
room = strings.SplitN(v.From, "/", 2)[0]
|
||||||
|
nick = strings.SplitN(v.From, "/", 2)[1]
|
||||||
|
)
|
||||||
|
|
||||||
if slices.Contains(roomsConnected, iqErrorCancelNotAcceptable.By) && nick == config.Jabber.Nick {
|
if slices.Contains(roomsConnected, iqErrorCancelNotAcceptable.By) && nick == getBotNickFromRoomConfig(room) {
|
||||||
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,
|
||||||
|
|||||||
18
lib.go
18
lib.go
@@ -120,7 +120,7 @@ func establishConnection() {
|
|||||||
|
|
||||||
// Джойнимся к чятикам, но делаем это в фоне, чтобы не блочиться на ошибках, например, если бота забанили
|
// Джойнимся к чятикам, но делаем это в фоне, чтобы не блочиться на ошибках, например, если бота забанили
|
||||||
for _, room := range config.Jabber.Channels {
|
for _, room := range config.Jabber.Channels {
|
||||||
go joinMuc(room)
|
go joinMuc(room.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
go RotateStatus("")
|
go RotateStatus("")
|
||||||
@@ -177,7 +177,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)
|
||||||
@@ -356,7 +357,7 @@ 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)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -554,4 +555,15 @@ func getMucNames(room string) []string {
|
|||||||
return names
|
return names
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getBotNickFromRoomConfig достаёт (короткий) ник бота из настроек чата
|
||||||
|
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,6 +187,18 @@ 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 n, channel := range sampleConfig.Jabber.Channels {
|
||||||
|
if channel.Name == "" {
|
||||||
|
return errors.New("no \"name\" entry in jabber channel config")
|
||||||
|
}
|
||||||
|
|
||||||
|
if channel.Nick == "" {
|
||||||
|
sampleConfig.Jabber.Channels[n].Nick = sampleConfig.Jabber.Nick
|
||||||
|
}
|
||||||
|
|
||||||
|
// channel.Password может быть пустым, тогда пароля нет
|
||||||
|
}
|
||||||
|
|
||||||
// Если список фраз с которыми стартует бот пустой, вносим в него 1 запись с пустой строкой
|
// Если список фраз с которыми стартует бот пустой, вносим в него 1 запись с пустой строкой
|
||||||
if len(sampleConfig.Jabber.StartupStatus) == 0 {
|
if len(sampleConfig.Jabber.StartupStatus) == 0 {
|
||||||
sampleConfig.Jabber.StartupStatus[0] = ""
|
sampleConfig.Jabber.StartupStatus[0] = ""
|
||||||
@@ -222,6 +234,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
|
||||||
|
|||||||
10
types.go
10
types.go
@@ -30,9 +30,13 @@ type myConfig struct {
|
|||||||
User string `json:"user,omitempty"`
|
User string `json:"user,omitempty"`
|
||||||
Password string `json:"password,omitempty"`
|
Password string `json:"password,omitempty"`
|
||||||
BotMasters []string `json:"bot_masters"`
|
BotMasters []string `json:"bot_masters"`
|
||||||
Channels []string `json:"channels"`
|
Channels []struct {
|
||||||
StartupStatus []string `json:"startup_status,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
RuntimeStatus struct {
|
Nick string `json:"nick,omitempty"`
|
||||||
|
Password string `json:"password,omitempty"`
|
||||||
|
} `json:"channels,omitempty"`
|
||||||
|
StartupStatus []string `json:"startup_status,omitempty"`
|
||||||
|
RuntimeStatus struct {
|
||||||
Text []string `json:"text,omitempty"`
|
Text []string `json:"text,omitempty"`
|
||||||
RotationTime int64 `json:"rotation_time,omitempty"`
|
RotationTime int64 `json:"rotation_time,omitempty"`
|
||||||
RotationSplayTime int64 `json:"rotation_splay_time,omitempty"`
|
RotationSplayTime int64 `json:"rotation_splay_time,omitempty"`
|
||||||
|
|||||||
Reference in New Issue
Block a user