Skip to content

Commit

Permalink
Add topic handler (#383)
Browse files Browse the repository at this point in the history
* Added new topic setting.

* Added Topic handler that will optionally forward topic changes from IRC to the Telegram channel.

Co-authored-by: Tim Zabel <Tjzabel21@gmail.com>
  • Loading branch information
xforever1313 and Tjzabel committed Oct 20, 2021
1 parent 4a80eb2 commit 3ebd878
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 4 deletions.
3 changes: 3 additions & 0 deletions docs/user/config-file-glossary.rst
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ Telegram settings
``MAX_MESSAGES_PER_MINUTE=20``
Maximum number of messages sent to Telegram from IRC per minute.

``SHOW_TOPIC_MESSAGE=true``
Send Telegram message when the topic in the IRC channel is changed.

``SHOW_ACTION_MESSAGE=true``
Relay action messages (e.g. ``/me thinks TeleIRC is cool!``).

Expand Down
1 change: 1 addition & 0 deletions env.example
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ IRC_QUIT_MESSAGE="TeleIRC bridge stopped."
TELEGRAM_CHAT_ID=-0000000000000
TELEIRC_TOKEN=000000000:AAAAAAaAAa2AaAAaoAAAA-a_aaAAaAaaaAA
MAX_MESSAGES_PER_MINUTE=20
SHOW_TOPIC_MESSAGE=true
SHOW_ACTION_MESSAGE=true
SHOW_JOIN_MESSAGE=false
JOIN_MESSAGE_ALLOW_LIST=""
Expand Down
1 change: 1 addition & 0 deletions internal/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ type TelegramSettings struct {
ChatID int64 `env:"TELEGRAM_CHAT_ID,required"`
Prefix string `env:"TELEGRAM_MESSAGE_PREFIX" envDefault:"<"`
Suffix string `env:"TELEGRAM_MESSAGE_SUFFIX" envDefault:">"`
ShowTopicMessage bool `env:"SHOW_TOPIC_MESSAGE" envDefault:"false"`
ShowJoinMessage bool `env:"SHOW_JOIN_MESSAGE" envDefault:"false"`
JoinMessageAllowList []string `env:"JOIN_MESSAGE_ALLOW_LIST" envDefault:"[]string{}"`
ShowActionMessage bool `env:"SHOW_ACTION_MESSAGE" envDefault:"false"`
Expand Down
28 changes: 24 additions & 4 deletions internal/handlers/irc/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import (
)

const (
joinFmt = "* %s joins"
partFmt = "* %s parts"
quitFmt = "* %s quit (%s)"
kickFmt = "* %s kicked %s from %s: %s"
joinFmt = "* %s joins"
partFmt = "* %s parts"
quitFmt = "* %s quit (%s)"
kickFmt = "* %s kicked %s from %s: %s"
topicChangeFmt = "* %s changed topic to: %s"
topicClearedFmt = "* %s removed topic"
)

/*
Expand Down Expand Up @@ -151,6 +153,23 @@ func partHandler(c ClientInterface) func(*girc.Client, girc.Event) {
}
}

func topicHandler(c ClientInterface) func(*girc.Client, girc.Event) {
return func(gc *girc.Client, e girc.Event) {
c.Logger().LogDebug("topicHandler triggered")
if c.TgSettings().ShowTopicMessage {
// e.Source.Name is the user who changed the topic.
// e.Params[0] is the channel where the topic changed.
// e.Params[1] is the new topic. We should assume that
// this may or may not appear as its possible to clear a topic.
if len(e.Params) <= 1 {
c.SendToTg(fmt.Sprintf(topicClearedFmt, e.Source.Name))
} else {
c.SendToTg(fmt.Sprintf(topicChangeFmt, e.Source.Name, e.Params[1]))
}
}
}
}

func quitHandler(c ClientInterface) func(*girc.Client, girc.Event) {
return func(gc *girc.Client, e girc.Event) {
c.Logger().LogDebug("quitHandler triggered")
Expand Down Expand Up @@ -190,6 +209,7 @@ func getHandlerMapping() map[string]Handler {
girc.KICK: kickHandler,
girc.PRIVMSG: messageHandler,
girc.PART: partHandler,
girc.TOPIC: topicHandler,
girc.QUIT: quitHandler,
}
}
114 changes: 114 additions & 0 deletions internal/handlers/irc/handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,120 @@ func TestKickHandlerNoReason(t *testing.T) {
})
}

func TestTopicHandler_On(t *testing.T) {
ctrl := gomock.NewController(t)

defer ctrl.Finish()

tgSettings := internal.TelegramSettings{
ShowTopicMessage: true,
}

mockClient := NewMockClientInterface(ctrl)
mockLogger := internal.NewMockDebugLogger(ctrl)
mockClient.
EXPECT().
Logger().
Return(mockLogger)
mockLogger.
EXPECT().
LogDebug(gomock.Eq("topicHandler triggered"))
mockClient.
EXPECT().
TgSettings().
Return(&tgSettings)
mockClient.
EXPECT().
SendToTg(gomock.Eq("* TEST_NAME changed topic to: NEW TOPIC!"))

myHandler := topicHandler(mockClient)
myHandler(&girc.Client{}, girc.Event{
Source: &girc.Source{
Name: "TEST_NAME",
},
Params: []string{
"#testchannel",
"NEW TOPIC!",
},
})
}

func TestTopicHandler_Off(t *testing.T) {
ctrl := gomock.NewController(t)

defer ctrl.Finish()

tgSettings := internal.TelegramSettings{
ShowTopicMessage: false,
}

mockClient := NewMockClientInterface(ctrl)
mockLogger := internal.NewMockDebugLogger(ctrl)
mockClient.
EXPECT().
Logger().
Return(mockLogger)
mockLogger.
EXPECT().
LogDebug(gomock.Eq("topicHandler triggered"))
mockClient.
EXPECT().
TgSettings().
Return(&tgSettings)
mockClient.
EXPECT().
SendToTg(gomock.Any()).
MaxTimes(0)

myHandler := topicHandler(mockClient)
myHandler(&girc.Client{}, girc.Event{
Source: &girc.Source{
Name: "TEST_NAME",
},
Params: []string{
"#testchannel",
"NEW TOPIC!",
},
})
}

func TestTopicHandlerCleared(t *testing.T) {
ctrl := gomock.NewController(t)

defer ctrl.Finish()

tgSettings := internal.TelegramSettings{
ShowTopicMessage: true,
}

mockClient := NewMockClientInterface(ctrl)
mockLogger := internal.NewMockDebugLogger(ctrl)
mockClient.
EXPECT().
Logger().
Return(mockLogger)
mockLogger.
EXPECT().
LogDebug(gomock.Eq("topicHandler triggered"))
mockClient.
EXPECT().
TgSettings().
Return(&tgSettings)
mockClient.
EXPECT().
SendToTg(gomock.Eq("* TEST_NAME removed topic"))

myHandler := topicHandler(mockClient)
myHandler(&girc.Client{}, girc.Event{
Source: &girc.Source{
Name: "TEST_NAME",
},
Params: []string{
"#testchannel",
},
})
}

func TestConnectHandlerKey(t *testing.T) {
ctrl := gomock.NewController(t)

Expand Down

0 comments on commit 3ebd878

Please sign in to comment.