Update vendor
* go-telegram-bot-api/telegram-bot-api * lrstanley/girc * matterbridge/gomatrix
This commit is contained in:
parent
c585d00f16
commit
d2044c647b
6
go.mod
6
go.mod
|
@ -8,7 +8,7 @@ require (
|
||||||
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec
|
github.com/dfordsoft/golib v0.0.0-20180902042739-76ee6ab99bec
|
||||||
github.com/dgrijalva/jwt-go v0.0.0-20170508165458-6c8dedd55f8a // indirect
|
github.com/dgrijalva/jwt-go v0.0.0-20170508165458-6c8dedd55f8a // indirect
|
||||||
github.com/fsnotify/fsnotify v1.4.7
|
github.com/fsnotify/fsnotify v1.4.7
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
|
||||||
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc // indirect
|
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc // indirect
|
||||||
github.com/google/gops v0.3.5
|
github.com/google/gops v0.3.5
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f // indirect
|
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f // indirect
|
||||||
|
@ -22,11 +22,11 @@ require (
|
||||||
github.com/kr/pretty v0.1.0 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
github.com/labstack/echo v3.3.5+incompatible
|
github.com/labstack/echo v3.3.5+incompatible
|
||||||
github.com/labstack/gommon v0.2.1 // indirect
|
github.com/labstack/gommon v0.2.1 // indirect
|
||||||
github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519
|
github.com/lrstanley/girc v0.0.0-20190102153329-c1e59a02f488
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect
|
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect
|
||||||
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 // indirect
|
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 // indirect
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20171224233421-78ac6a1a0f5f
|
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544
|
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544
|
||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61
|
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61
|
||||||
github.com/mattermost/mattermost-server v5.5.0+incompatible
|
github.com/mattermost/mattermost-server v5.5.0+incompatible
|
||||||
|
|
8
go.sum
8
go.sum
|
@ -18,6 +18,8 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
||||||
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible h1:i64CCJcSqkRIkm5OSdZQjZq84/gJsk2zNwHWIRYWlKE=
|
||||||
|
github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
|
||||||
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc h1:wdhDSKrkYy24mcfzuA3oYm58h0QkyXjwERCkzJDP5kA=
|
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc h1:wdhDSKrkYy24mcfzuA3oYm58h0QkyXjwERCkzJDP5kA=
|
||||||
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/google/gops v0.3.5 h1:SIWvPLiYvy5vMwjxB3rVFTE4QBhUFj2KKWr3Xm7CKhw=
|
github.com/google/gops v0.3.5 h1:SIWvPLiYvy5vMwjxB3rVFTE4QBhUFj2KKWr3Xm7CKhw=
|
||||||
|
@ -55,6 +57,8 @@ github.com/labstack/gommon v0.2.1 h1:C+I4NYknueQncqKYZQ34kHsLZJVeB5KwPUhnO0nmbpU
|
||||||
github.com/labstack/gommon v0.2.1/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
|
github.com/labstack/gommon v0.2.1/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
|
||||||
github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519 h1:o7duXxs4nxplgWrFRJoyGrPAS+U9Sk5eQyc2mflk6/Q=
|
github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519 h1:o7duXxs4nxplgWrFRJoyGrPAS+U9Sk5eQyc2mflk6/Q=
|
||||||
github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519/go.mod h1:7cRs1SIBfKQ7e3Tam6GKTILSNHzR862JD0JpINaZoJk=
|
github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519/go.mod h1:7cRs1SIBfKQ7e3Tam6GKTILSNHzR862JD0JpINaZoJk=
|
||||||
|
github.com/lrstanley/girc v0.0.0-20190102153329-c1e59a02f488 h1:dDEQN5oaa0WOzEiPDSbOugW/e2I/SWY98HYRdcwmGfY=
|
||||||
|
github.com/lrstanley/girc v0.0.0-20190102153329-c1e59a02f488/go.mod h1:7cRs1SIBfKQ7e3Tam6GKTILSNHzR862JD0JpINaZoJk=
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 h1:AsEBgzv3DhuYHI/GiQh2HxvTP71HCCE9E/tzGUzGdtU=
|
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 h1:AsEBgzv3DhuYHI/GiQh2HxvTP71HCCE9E/tzGUzGdtU=
|
||||||
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0=
|
github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0=
|
||||||
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 h1:iOAVXzZyXtW408TMYejlUPo6BIn92HmOacWtIfNyYns=
|
github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 h1:iOAVXzZyXtW408TMYejlUPo6BIn92HmOacWtIfNyYns=
|
||||||
|
@ -63,8 +67,8 @@ github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDe
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 h1:KzDEcy8eDbTx881giW8a6llsAck3e2bJvMyKvh1IK+k=
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91 h1:KzDEcy8eDbTx881giW8a6llsAck3e2bJvMyKvh1IK+k=
|
||||||
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
|
github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91/go.mod h1:ECDRehsR9TYTKCAsRS8/wLeOk6UUqDydw47ln7wG41Q=
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20171224233421-78ac6a1a0f5f h1:2eKh6Qi/sJ8bXvYMoyVfQxHgR8UcCDWjOmhV1oCstMU=
|
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea h1:kaADGqpK4gGO2BpzEyJrBxq2Jc57Rsar4i2EUxcACUc=
|
||||||
github.com/matterbridge/gomatrix v0.0.0-20171224233421-78ac6a1a0f5f/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
|
github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea/go.mod h1:+jWeaaUtXQbBRdKYWfjW6JDDYiI2XXE+3NnTjW5kg8g=
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544 h1:A8lLG3DAu75B5jITHs9z4JBmU6oCq1WiUNnDAmqKCZc=
|
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544 h1:A8lLG3DAu75B5jITHs9z4JBmU6oCq1WiUNnDAmqKCZc=
|
||||||
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
|
github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544/go.mod h1:yAjnZ34DuDyPHMPHHjOsTk/FefW4JJjoMMCGt/8uuQA=
|
||||||
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61 h1:R/MgM/eUyRBQx2FiH6JVmXck8PaAuKfe2M1tWIzW7nE=
|
github.com/matterbridge/logrus-prefixed-formatter v0.0.0-20180806162718-01618749af61 h1:R/MgM/eUyRBQx2FiH6JVmXck8PaAuKfe2M1tWIzW7nE=
|
||||||
|
|
|
@ -526,6 +526,7 @@ func (bot *BotAPI) ListenForWebhook(pattern string) UpdatesChannel {
|
||||||
|
|
||||||
http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
|
||||||
bytes, _ := ioutil.ReadAll(r.Body)
|
bytes, _ := ioutil.ReadAll(r.Body)
|
||||||
|
r.Body.Close()
|
||||||
|
|
||||||
var update Update
|
var update Update
|
||||||
json.Unmarshal(bytes, &update)
|
json.Unmarshal(bytes, &update)
|
||||||
|
|
|
@ -459,6 +459,15 @@ func NewInlineQueryResultGIF(id, url string) InlineQueryResultGIF {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedGIF create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedGIF(id, gifID string) InlineQueryResultCachedGIF {
|
||||||
|
return InlineQueryResultCachedGIF{
|
||||||
|
Type: "gif",
|
||||||
|
ID: id,
|
||||||
|
GifID: gifID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultMPEG4GIF creates a new inline query MPEG4 GIF.
|
// NewInlineQueryResultMPEG4GIF creates a new inline query MPEG4 GIF.
|
||||||
func NewInlineQueryResultMPEG4GIF(id, url string) InlineQueryResultMPEG4GIF {
|
func NewInlineQueryResultMPEG4GIF(id, url string) InlineQueryResultMPEG4GIF {
|
||||||
return InlineQueryResultMPEG4GIF{
|
return InlineQueryResultMPEG4GIF{
|
||||||
|
@ -468,6 +477,15 @@ func NewInlineQueryResultMPEG4GIF(id, url string) InlineQueryResultMPEG4GIF {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedPhoto create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedMPEG4GIF(id, MPEG4GifID string) InlineQueryResultCachedMpeg4Gif {
|
||||||
|
return InlineQueryResultCachedMpeg4Gif{
|
||||||
|
Type: "mpeg4_gif",
|
||||||
|
ID: id,
|
||||||
|
MGifID: MPEG4GifID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultPhoto creates a new inline query photo.
|
// NewInlineQueryResultPhoto creates a new inline query photo.
|
||||||
func NewInlineQueryResultPhoto(id, url string) InlineQueryResultPhoto {
|
func NewInlineQueryResultPhoto(id, url string) InlineQueryResultPhoto {
|
||||||
return InlineQueryResultPhoto{
|
return InlineQueryResultPhoto{
|
||||||
|
@ -487,6 +505,15 @@ func NewInlineQueryResultPhotoWithThumb(id, url, thumb string) InlineQueryResult
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedPhoto create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedPhoto(id, photoID string) InlineQueryResultCachedPhoto {
|
||||||
|
return InlineQueryResultCachedPhoto{
|
||||||
|
Type: "photo",
|
||||||
|
ID: id,
|
||||||
|
PhotoID: photoID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultVideo creates a new inline query video.
|
// NewInlineQueryResultVideo creates a new inline query video.
|
||||||
func NewInlineQueryResultVideo(id, url string) InlineQueryResultVideo {
|
func NewInlineQueryResultVideo(id, url string) InlineQueryResultVideo {
|
||||||
return InlineQueryResultVideo{
|
return InlineQueryResultVideo{
|
||||||
|
@ -496,6 +523,16 @@ func NewInlineQueryResultVideo(id, url string) InlineQueryResultVideo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedVideo create a new inline query with cached video.
|
||||||
|
func NewInlineQueryResultCachedVideo(id, videoID, title string) InlineQueryResultCachedVideo {
|
||||||
|
return InlineQueryResultCachedVideo{
|
||||||
|
Type: "video",
|
||||||
|
ID: id,
|
||||||
|
VideoID: videoID,
|
||||||
|
Title: title,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultAudio creates a new inline query audio.
|
// NewInlineQueryResultAudio creates a new inline query audio.
|
||||||
func NewInlineQueryResultAudio(id, url, title string) InlineQueryResultAudio {
|
func NewInlineQueryResultAudio(id, url, title string) InlineQueryResultAudio {
|
||||||
return InlineQueryResultAudio{
|
return InlineQueryResultAudio{
|
||||||
|
@ -506,6 +543,15 @@ func NewInlineQueryResultAudio(id, url, title string) InlineQueryResultAudio {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedAudio create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedAudio(id, audioID string) InlineQueryResultCachedAudio {
|
||||||
|
return InlineQueryResultCachedAudio{
|
||||||
|
Type: "audio",
|
||||||
|
ID: id,
|
||||||
|
AudioID: audioID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultVoice creates a new inline query voice.
|
// NewInlineQueryResultVoice creates a new inline query voice.
|
||||||
func NewInlineQueryResultVoice(id, url, title string) InlineQueryResultVoice {
|
func NewInlineQueryResultVoice(id, url, title string) InlineQueryResultVoice {
|
||||||
return InlineQueryResultVoice{
|
return InlineQueryResultVoice{
|
||||||
|
@ -516,6 +562,16 @@ func NewInlineQueryResultVoice(id, url, title string) InlineQueryResultVoice {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedVoice create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedVoice(id, voiceID, title string) InlineQueryResultCachedVoice {
|
||||||
|
return InlineQueryResultCachedVoice{
|
||||||
|
Type: "voice",
|
||||||
|
ID: id,
|
||||||
|
VoiceID: voiceID,
|
||||||
|
Title: title,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultDocument creates a new inline query document.
|
// NewInlineQueryResultDocument creates a new inline query document.
|
||||||
func NewInlineQueryResultDocument(id, url, title, mimeType string) InlineQueryResultDocument {
|
func NewInlineQueryResultDocument(id, url, title, mimeType string) InlineQueryResultDocument {
|
||||||
return InlineQueryResultDocument{
|
return InlineQueryResultDocument{
|
||||||
|
@ -527,6 +583,16 @@ func NewInlineQueryResultDocument(id, url, title, mimeType string) InlineQueryRe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewInlineQueryResultCachedDocument create a new inline query with cached photo.
|
||||||
|
func NewInlineQueryResultCachedDocument(id, documentID, title string) InlineQueryResultCachedDocument {
|
||||||
|
return InlineQueryResultCachedDocument{
|
||||||
|
Type: "document",
|
||||||
|
ID: id,
|
||||||
|
DocumentID: documentID,
|
||||||
|
Title: title,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewInlineQueryResultLocation creates a new inline query location.
|
// NewInlineQueryResultLocation creates a new inline query location.
|
||||||
func NewInlineQueryResultLocation(id, title string, latitude, longitude float64) InlineQueryResultLocation {
|
func NewInlineQueryResultLocation(id, title string, latitude, longitude float64) InlineQueryResultLocation {
|
||||||
return InlineQueryResultLocation{
|
return InlineQueryResultLocation{
|
||||||
|
|
|
@ -586,6 +586,19 @@ type InlineQueryResultPhoto struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedPhoto is an inline query response with cached photo.
|
||||||
|
type InlineQueryResultCachedPhoto struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
PhotoID string `json:"photo_file_id"` // required
|
||||||
|
Title string `json:"title"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultGIF is an inline query response GIF.
|
// InlineQueryResultGIF is an inline query response GIF.
|
||||||
type InlineQueryResultGIF struct {
|
type InlineQueryResultGIF struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -601,6 +614,18 @@ type InlineQueryResultGIF struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedGIF is an inline query response with cached gif.
|
||||||
|
type InlineQueryResultCachedGIF struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
GifID string `json:"gif_file_id"` // required
|
||||||
|
Title string `json:"title"`
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultMPEG4GIF is an inline query response MPEG4 GIF.
|
// InlineQueryResultMPEG4GIF is an inline query response MPEG4 GIF.
|
||||||
type InlineQueryResultMPEG4GIF struct {
|
type InlineQueryResultMPEG4GIF struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -616,6 +641,19 @@ type InlineQueryResultMPEG4GIF struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedMpeg4Gif is an inline query response with cached
|
||||||
|
// H.264/MPEG-4 AVC video without sound gif.
|
||||||
|
type InlineQueryResultCachedMpeg4Gif struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
MGifID string `json:"mpeg4_file_id"` // required
|
||||||
|
Title string `json:"title"`
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultVideo is an inline query response video.
|
// InlineQueryResultVideo is an inline query response video.
|
||||||
type InlineQueryResultVideo struct {
|
type InlineQueryResultVideo struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -633,6 +671,19 @@ type InlineQueryResultVideo struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedVideo is an inline query response with cached video.
|
||||||
|
type InlineQueryResultCachedVideo struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
VideoID string `json:"video_file_id"` // required
|
||||||
|
Title string `json:"title"` // required
|
||||||
|
Description string `json:"description"`
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultAudio is an inline query response audio.
|
// InlineQueryResultAudio is an inline query response audio.
|
||||||
type InlineQueryResultAudio struct {
|
type InlineQueryResultAudio struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -646,6 +697,17 @@ type InlineQueryResultAudio struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedAudio is an inline query response with cached audio.
|
||||||
|
type InlineQueryResultCachedAudio struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
AudioID string `json:"audio_file_id"` // required
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultVoice is an inline query response voice.
|
// InlineQueryResultVoice is an inline query response voice.
|
||||||
type InlineQueryResultVoice struct {
|
type InlineQueryResultVoice struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -658,6 +720,18 @@ type InlineQueryResultVoice struct {
|
||||||
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedVoice is an inline query response with cached voice.
|
||||||
|
type InlineQueryResultCachedVoice struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
VoiceID string `json:"voice_file_id"` // required
|
||||||
|
Title string `json:"title"` // required
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultDocument is an inline query response document.
|
// InlineQueryResultDocument is an inline query response document.
|
||||||
type InlineQueryResultDocument struct {
|
type InlineQueryResultDocument struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
@ -674,6 +748,19 @@ type InlineQueryResultDocument struct {
|
||||||
ThumbHeight int `json:"thumb_height"`
|
ThumbHeight int `json:"thumb_height"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InlineQueryResultCachedDocument is an inline query response with cached document.
|
||||||
|
type InlineQueryResultCachedDocument struct {
|
||||||
|
Type string `json:"type"` // required
|
||||||
|
ID string `json:"id"` // required
|
||||||
|
DocumentID string `json:"document_file_id"` // required
|
||||||
|
Title string `json:"title"` // required
|
||||||
|
Caption string `json:"caption"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
ParseMode string `json:"parse_mode"`
|
||||||
|
ReplyMarkup *InlineKeyboardMarkup `json:"reply_markup,omitempty"`
|
||||||
|
InputMessageContent interface{} `json:"input_message_content,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// InlineQueryResultLocation is an inline query response location.
|
// InlineQueryResultLocation is an inline query response location.
|
||||||
type InlineQueryResultLocation struct {
|
type InlineQueryResultLocation struct {
|
||||||
Type string `json:"type"` // required
|
Type string `json:"type"` // required
|
||||||
|
|
|
@ -88,6 +88,8 @@ girc artwork licensed under [CC 3.0](http://creativecommons.org/licenses/by/3.0/
|
||||||
* [IRCv3: Specification Docs](http://ircv3.net/irc/)
|
* [IRCv3: Specification Docs](http://ircv3.net/irc/)
|
||||||
* [IRCv3: Specification Repo](https://github.com/ircv3/ircv3-specifications)
|
* [IRCv3: Specification Repo](https://github.com/ircv3/ircv3-specifications)
|
||||||
* [IRCv3 Capability Registry](http://ircv3.net/registry.html)
|
* [IRCv3 Capability Registry](http://ircv3.net/registry.html)
|
||||||
|
* [IRCv3: WEBIRC](https://ircv3.net/specs/extensions/webirc.html)
|
||||||
|
* [KiwiIRC: WEBIRC](https://kiwiirc.com/docs/webirc)
|
||||||
* [ISUPPORT Specification Docs](http://www.irc.org/tech_docs/005.html) ([alternative 1](http://defs.ircdocs.horse/defs/isupport.html), [alternative 2](https://github.com/grawity/irc-docs/blob/master/client/RPL_ISUPPORT/draft-hardy-irc-isupport-00.txt), [relevant draft](http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt))
|
* [ISUPPORT Specification Docs](http://www.irc.org/tech_docs/005.html) ([alternative 1](http://defs.ircdocs.horse/defs/isupport.html), [alternative 2](https://github.com/grawity/irc-docs/blob/master/client/RPL_ISUPPORT/draft-hardy-irc-isupport-00.txt), [relevant draft](http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt))
|
||||||
* [IRC Numerics List](http://defs.ircdocs.horse/defs/numerics.html)
|
* [IRC Numerics List](http://defs.ircdocs.horse/defs/numerics.html)
|
||||||
* [Extended WHO (also known as WHOX)](https://github.com/quakenet/snircd/blob/master/doc/readme.who)
|
* [Extended WHO (also known as WHOX)](https://github.com/quakenet/snircd/blob/master/doc/readme.who)
|
||||||
|
|
|
@ -145,7 +145,7 @@ func handleJOIN(c *Client, e Event) {
|
||||||
|
|
||||||
user := c.state.lookupUser(e.Source.Name)
|
user := c.state.lookupUser(e.Source.Name)
|
||||||
if user == nil {
|
if user == nil {
|
||||||
if ok := c.state.createUser(e.Source.Name); !ok {
|
if ok := c.state.createUser(e.Source); !ok {
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ func handleJOIN(c *Client, e Event) {
|
||||||
}
|
}
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
|
|
||||||
if e.Source.Name == c.GetNick() {
|
if e.Source.ID() == c.GetID() {
|
||||||
// If it's us, don't just add our user to the list. Run a WHO which
|
// If it's us, don't just add our user to the list. Run a WHO which
|
||||||
// will tell us who exactly is in the entire channel.
|
// will tell us who exactly is in the entire channel.
|
||||||
c.Send(&Event{Command: WHO, Params: []string{channelName, "%tacuhnr,1"}})
|
c.Send(&Event{Command: WHO, Params: []string{channelName, "%tacuhnr,1"}})
|
||||||
|
@ -209,7 +209,7 @@ func handlePART(c *Client, e Event) {
|
||||||
|
|
||||||
defer c.state.notify(c, UPDATE_STATE)
|
defer c.state.notify(c, UPDATE_STATE)
|
||||||
|
|
||||||
if e.Source.Name == c.GetNick() {
|
if e.Source.ID() == c.GetID() {
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
c.state.deleteChannel(channel)
|
c.state.deleteChannel(channel)
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
|
@ -217,7 +217,7 @@ func handlePART(c *Client, e Event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
c.state.deleteUser(channel, e.Source.Name)
|
c.state.deleteUser(channel, e.Source.ID())
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,9 +327,9 @@ func handleNICK(c *Client, e Event) {
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
// renameUser updates the LastActive time automatically.
|
// renameUser updates the LastActive time automatically.
|
||||||
if len(e.Params) == 1 {
|
if len(e.Params) == 1 {
|
||||||
c.state.renameUser(e.Source.Name, e.Params[0])
|
c.state.renameUser(e.Source.ID(), e.Params[0])
|
||||||
} else if len(e.Trailing) > 0 {
|
} else if len(e.Trailing) > 0 {
|
||||||
c.state.renameUser(e.Source.Name, e.Trailing)
|
c.state.renameUser(e.Source.ID(), e.Trailing)
|
||||||
}
|
}
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
c.state.notify(c, UPDATE_STATE)
|
c.state.notify(c, UPDATE_STATE)
|
||||||
|
@ -341,12 +341,12 @@ func handleQUIT(c *Client, e Event) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.Source.Name == c.GetNick() {
|
if e.Source.ID() == c.GetID() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
c.state.deleteUser("", e.Source.Name)
|
c.state.deleteUser("", e.Source.ID())
|
||||||
c.state.Unlock()
|
c.state.Unlock()
|
||||||
c.state.notify(c, UPDATE_STATE)
|
c.state.notify(c, UPDATE_STATE)
|
||||||
}
|
}
|
||||||
|
@ -443,8 +443,9 @@ func handleNAMES(c *Client, e Event) {
|
||||||
|
|
||||||
parts := strings.Split(e.Trailing, " ")
|
parts := strings.Split(e.Trailing, " ")
|
||||||
|
|
||||||
var host, ident, modes, nick string
|
var modes, nick string
|
||||||
var ok bool
|
var ok bool
|
||||||
|
s := &Source{}
|
||||||
|
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
for i := 0; i < len(parts); i++ {
|
for i := 0; i < len(parts); i++ {
|
||||||
|
@ -455,36 +456,29 @@ func handleNAMES(c *Client, e Event) {
|
||||||
|
|
||||||
// If userhost-in-names.
|
// If userhost-in-names.
|
||||||
if strings.Contains(nick, "@") {
|
if strings.Contains(nick, "@") {
|
||||||
s := ParseSource(nick)
|
s = ParseSource(nick)
|
||||||
if s == nil {
|
if s == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
host = s.Host
|
} else {
|
||||||
nick = s.Name
|
s = &Source{
|
||||||
ident = s.Ident
|
Name: nick,
|
||||||
}
|
}
|
||||||
|
|
||||||
if !IsValidNick(nick) {
|
if !IsValidNick(s.Name) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.state.createUser(nick)
|
c.state.createUser(s)
|
||||||
user := c.state.lookupUser(nick)
|
user := c.state.lookupUser(s.Name)
|
||||||
if user == nil {
|
if user == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
user.addChannel(channel.Name)
|
user.addChannel(channel.Name)
|
||||||
channel.addUser(nick)
|
channel.addUser(s.ID())
|
||||||
|
|
||||||
// Add necessary userhost-in-names data into the user.
|
|
||||||
if host != "" {
|
|
||||||
user.Host = host
|
|
||||||
}
|
|
||||||
if ident != "" {
|
|
||||||
user.Ident = ident
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't append modes, overwrite them.
|
// Don't append modes, overwrite them.
|
||||||
perms, _ := user.Perms.Lookup(channel.Name)
|
perms, _ := user.Perms.Lookup(channel.Name)
|
||||||
|
|
|
@ -25,7 +25,7 @@ func handleTags(c *Client, e Event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.state.Lock()
|
c.state.Lock()
|
||||||
user := c.state.lookupUser(e.Source.Name)
|
user := c.state.lookupUser(e.Source.ID())
|
||||||
if user != nil {
|
if user != nil {
|
||||||
user.Extras.Account = account
|
user.Extras.Account = account
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,10 @@ type Config struct {
|
||||||
// supported. Capability tracking must be enabled for this to work, as
|
// supported. Capability tracking must be enabled for this to work, as
|
||||||
// this requires IRCv3 CAP handling.
|
// this requires IRCv3 CAP handling.
|
||||||
SASL SASLMech
|
SASL SASLMech
|
||||||
|
// WebIRC allows forwarding source user hostname/ip information to the server
|
||||||
|
// (if supported by the server) to ensure the source machine doesn't show as
|
||||||
|
// the source. See the WebIRC type for more information.
|
||||||
|
WebIRC WebIRC
|
||||||
// Bind is used to bind to a specific host or ip during the dial process
|
// Bind is used to bind to a specific host or ip during the dial process
|
||||||
// when connecting to the server. This can be a hostname, however it must
|
// when connecting to the server. This can be a hostname, however it must
|
||||||
// resolve to an IPv4/IPv6 address bindable on your system. Otherwise,
|
// resolve to an IPv4/IPv6 address bindable on your system. Otherwise,
|
||||||
|
@ -154,6 +158,39 @@ type Config struct {
|
||||||
HandleNickCollide func(oldNick string) (newNick string)
|
HandleNickCollide func(oldNick string) (newNick string)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WebIRC is useful when a user connects through an indirect method, such web
|
||||||
|
// clients, the indirect client sends its own IP address instead of sending the
|
||||||
|
// user's IP address unless WebIRC is implemented by both the client and the
|
||||||
|
// server.
|
||||||
|
//
|
||||||
|
// Client expectations:
|
||||||
|
// - Perform any proxy resolution.
|
||||||
|
// - Check the reverse DNS and forward DNS match.
|
||||||
|
// - Check the IP against suitable access controls (ipaccess, dnsbl, etc).
|
||||||
|
//
|
||||||
|
// More information:
|
||||||
|
// - https://ircv3.net/specs/extensions/webirc.html
|
||||||
|
// - https://kiwiirc.com/docs/webirc
|
||||||
|
type WebIRC struct {
|
||||||
|
// Password that authenticates the WEBIRC command from this client.
|
||||||
|
Password string
|
||||||
|
// Gateway or client type requesting spoof (cgiirc defaults to cgiirc, as an
|
||||||
|
// example).
|
||||||
|
Gateway string
|
||||||
|
// Hostname of user.
|
||||||
|
Hostname string
|
||||||
|
// Address either in IPv4 dotted quad notation (e.g. 192.0.0.2) or IPv6
|
||||||
|
// notation (e.g. 1234:5678:9abc::def). IPv4-in-IPv6 addresses
|
||||||
|
// (e.g. ::ffff:192.0.0.2) should not be sent.
|
||||||
|
Address string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Params returns the arguments for the WEBIRC command that can be passed to the
|
||||||
|
// server.
|
||||||
|
func (w WebIRC) Params() []string {
|
||||||
|
return []string{w.Password, w.Gateway, w.Hostname, w.Address}
|
||||||
|
}
|
||||||
|
|
||||||
// ErrInvalidConfig is returned when the configuration passed to the client
|
// ErrInvalidConfig is returned when the configuration passed to the client
|
||||||
// is invalid.
|
// is invalid.
|
||||||
type ErrInvalidConfig struct {
|
type ErrInvalidConfig struct {
|
||||||
|
@ -273,7 +310,7 @@ func (c *Client) TLSConnectionState() (*tls.ConnectionState, error) {
|
||||||
// the connection to the server wasn't made with TLS.
|
// the connection to the server wasn't made with TLS.
|
||||||
var ErrConnNotTLS = errors.New("underlying connection is not tls")
|
var ErrConnNotTLS = errors.New("underlying connection is not tls")
|
||||||
|
|
||||||
// Close closes the network connection to the server, and sends a STOPPED
|
// Close closes the network connection to the server, and sends a CLOSED
|
||||||
// event. This should cause Connect() to return with nil. This should be
|
// event. This should cause Connect() to return with nil. This should be
|
||||||
// safe to call multiple times. See Connect()'s documentation on how
|
// safe to call multiple times. See Connect()'s documentation on how
|
||||||
// handlers and goroutines are handled when disconnected from the server.
|
// handlers and goroutines are handled when disconnected from the server.
|
||||||
|
@ -436,6 +473,12 @@ func (c *Client) GetNick() string {
|
||||||
return c.state.nick
|
return c.state.nick
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetID returns an RFC1459 compliant version of the current nickname. Panics
|
||||||
|
// if tracking is disabled.
|
||||||
|
func (c *Client) GetID() string {
|
||||||
|
return ToRFC1459(c.GetNick())
|
||||||
|
}
|
||||||
|
|
||||||
// GetIdent returns the current ident of the active connection. Panics if
|
// GetIdent returns the current ident of the active connection. Panics if
|
||||||
// tracking is disabled. May be empty, as this is obtained from when we join
|
// tracking is disabled. May be empty, as this is obtained from when we join
|
||||||
// a channel, as there is no other more efficient method to return this info.
|
// a channel, as there is no other more efficient method to return this info.
|
||||||
|
|
|
@ -359,3 +359,9 @@ func (cmd *Commands) List(channels ...string) {
|
||||||
func (cmd *Commands) Whowas(user string, amount int) {
|
func (cmd *Commands) Whowas(user string, amount int) {
|
||||||
cmd.c.Send(&Event{Command: WHOWAS, Params: []string{user, string(amount)}})
|
cmd.c.Send(&Event{Command: WHOWAS, Params: []string{user, string(amount)}})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Monitor sends a MONITOR query to the server. The results of the query
|
||||||
|
// depends on the given modifier, see https://ircv3.net/specs/core/monitor-3.2.html
|
||||||
|
func (cmd *Commands) Monitor(modifier rune, args ...string) {
|
||||||
|
cmd.c.Send(&Event{Command: MONITOR, Params: append([]string{string(modifier)}, args...)})
|
||||||
|
}
|
||||||
|
|
|
@ -284,6 +284,11 @@ func (c *Client) internalConnect(mock net.Conn, dialer Dialer) error {
|
||||||
go c.pingLoop(ctx, errs, &wg)
|
go c.pingLoop(ctx, errs, &wg)
|
||||||
|
|
||||||
// Passwords first.
|
// Passwords first.
|
||||||
|
|
||||||
|
if c.Config.WebIRC.Password != "" {
|
||||||
|
c.write(&Event{Command: WEBIRC, Params: c.Config.WebIRC.Params(), Sensitive: true})
|
||||||
|
}
|
||||||
|
|
||||||
if c.Config.ServerPass != "" {
|
if c.Config.ServerPass != "" {
|
||||||
c.write(&Event{Command: PASS, Params: []string{c.Config.ServerPass}, Sensitive: true})
|
c.write(&Event{Command: PASS, Params: []string{c.Config.ServerPass}, Sensitive: true})
|
||||||
}
|
}
|
||||||
|
@ -314,7 +319,7 @@ func (c *Client) internalConnect(mock net.Conn, dialer Dialer) error {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
c.debug.Print("received request to close, beginning clean up")
|
c.debug.Print("received request to close, beginning clean up")
|
||||||
c.RunHandlers(&Event{Command: STOPPED, Trailing: c.Server()})
|
c.RunHandlers(&Event{Command: CLOSED, Trailing: c.Server()})
|
||||||
case err := <-errs:
|
case err := <-errs:
|
||||||
c.debug.Print("received error, beginning clean up")
|
c.debug.Print("received error, beginning clean up")
|
||||||
result = err
|
result = err
|
||||||
|
@ -331,6 +336,8 @@ func (c *Client) internalConnect(mock net.Conn, dialer Dialer) error {
|
||||||
c.conn.mu.Unlock()
|
c.conn.mu.Unlock()
|
||||||
c.mu.RUnlock()
|
c.mu.RUnlock()
|
||||||
|
|
||||||
|
c.RunHandlers(&Event{Command: DISCONNECTED, Trailing: c.Server()})
|
||||||
|
|
||||||
// Once we have our error/result, let all other functions know we're done.
|
// Once we have our error/result, let all other functions know we're done.
|
||||||
c.debug.Print("waiting for all routines to finish")
|
c.debug.Print("waiting for all routines to finish")
|
||||||
|
|
||||||
|
@ -374,7 +381,7 @@ func (c *Client) readLoop(ctx context.Context, errs chan error, wg *sync.WaitGro
|
||||||
// Check if it's an echo-message.
|
// Check if it's an echo-message.
|
||||||
if !c.Config.disableTracking {
|
if !c.Config.disableTracking {
|
||||||
event.Echo = (event.Command == PRIVMSG || event.Command == NOTICE) &&
|
event.Echo = (event.Command == PRIVMSG || event.Command == NOTICE) &&
|
||||||
event.Source != nil && event.Source.Name == c.GetNick()
|
event.Source != nil && event.Source.ID() == c.GetID()
|
||||||
}
|
}
|
||||||
|
|
||||||
c.rx <- event
|
c.rx <- event
|
||||||
|
|
|
@ -27,7 +27,7 @@ const (
|
||||||
CONNECTED = "CLIENT_CONNECTED" // when it's safe to send arbitrary commands (joins, list, who, etc), trailing is host:port
|
CONNECTED = "CLIENT_CONNECTED" // when it's safe to send arbitrary commands (joins, list, who, etc), trailing is host:port
|
||||||
INITIALIZED = "CLIENT_INIT" // verifies successful socket connection, trailing is host:port
|
INITIALIZED = "CLIENT_INIT" // verifies successful socket connection, trailing is host:port
|
||||||
DISCONNECTED = "CLIENT_DISCONNECTED" // occurs when we're disconnected from the server (user-requested or not)
|
DISCONNECTED = "CLIENT_DISCONNECTED" // occurs when we're disconnected from the server (user-requested or not)
|
||||||
STOPPED = "CLIENT_STOPPED" // occurs when Client.Stop() has been called
|
CLOSED = "CLIENT_CLOSED" // occurs when Client.Close() has been called
|
||||||
)
|
)
|
||||||
|
|
||||||
// User/channel prefixes :: RFC1459.
|
// User/channel prefixes :: RFC1459.
|
||||||
|
@ -118,6 +118,7 @@ const (
|
||||||
USERS = "USERS"
|
USERS = "USERS"
|
||||||
VERSION = "VERSION"
|
VERSION = "VERSION"
|
||||||
WALLOPS = "WALLOPS"
|
WALLOPS = "WALLOPS"
|
||||||
|
WEBIRC = "WEBIRC"
|
||||||
WHO = "WHO"
|
WHO = "WHO"
|
||||||
WHOIS = "WHOIS"
|
WHOIS = "WHOIS"
|
||||||
WHOWAS = "WHOWAS"
|
WHOWAS = "WHOWAS"
|
||||||
|
@ -268,6 +269,7 @@ const (
|
||||||
// IRCv3 commands and extensions :: http://ircv3.net/irc/.
|
// IRCv3 commands and extensions :: http://ircv3.net/irc/.
|
||||||
const (
|
const (
|
||||||
AUTHENTICATE = "AUTHENTICATE"
|
AUTHENTICATE = "AUTHENTICATE"
|
||||||
|
MONITOR = "MONITOR"
|
||||||
STARTTLS = "STARTTLS"
|
STARTTLS = "STARTTLS"
|
||||||
|
|
||||||
CAP = "CAP"
|
CAP = "CAP"
|
||||||
|
@ -299,6 +301,11 @@ const (
|
||||||
RPL_SASLMECHS = "908"
|
RPL_SASLMECHS = "908"
|
||||||
RPL_STARTTLS = "670"
|
RPL_STARTTLS = "670"
|
||||||
ERR_STARTTLS = "691"
|
ERR_STARTTLS = "691"
|
||||||
|
RPL_MONONLINE = "730"
|
||||||
|
RPL_MONOFFLINE = "731"
|
||||||
|
RPL_MONLIST = "732"
|
||||||
|
RPL_ENDOFMONLIST = "733"
|
||||||
|
ERR_MONLISTFULL = "734"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Numeric IRC event mapping :: RFC2812; section 5.3.
|
// Numeric IRC event mapping :: RFC2812; section 5.3.
|
||||||
|
|
|
@ -155,8 +155,8 @@ func (c *CTCP) call(client *Client, event *CTCPEvent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send a ERRMSG reply, if we know who sent it.
|
// Send a ERRMSG reply, if we know who sent it.
|
||||||
if event.Source != nil && IsValidNick(event.Source.Name) {
|
if event.Source != nil && IsValidNick(event.Source.ID()) {
|
||||||
client.Cmd.SendCTCPReply(event.Source.Name, CTCP_ERRMSG, "that is an unknown CTCP query")
|
client.Cmd.SendCTCPReply(event.Source.ID(), CTCP_ERRMSG, "that is an unknown CTCP query")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ func handleCTCPPing(client *Client, ctcp CTCPEvent) {
|
||||||
if ctcp.Reply {
|
if ctcp.Reply {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_PING, ctcp.Text)
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_PING, ctcp.Text)
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleCTCPPong replies with a pong.
|
// handleCTCPPong replies with a pong.
|
||||||
|
@ -256,7 +256,7 @@ func handleCTCPPong(client *Client, ctcp CTCPEvent) {
|
||||||
if ctcp.Reply {
|
if ctcp.Reply {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_PONG, "")
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_PONG, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleCTCPVersion replies with the name of the client, Go version, as well
|
// handleCTCPVersion replies with the name of the client, Go version, as well
|
||||||
|
@ -264,12 +264,12 @@ func handleCTCPPong(client *Client, ctcp CTCPEvent) {
|
||||||
// arm, etc).
|
// arm, etc).
|
||||||
func handleCTCPVersion(client *Client, ctcp CTCPEvent) {
|
func handleCTCPVersion(client *Client, ctcp CTCPEvent) {
|
||||||
if client.Config.Version != "" {
|
if client.Config.Version != "" {
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_VERSION, client.Config.Version)
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_VERSION, client.Config.Version)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Cmd.SendCTCPReplyf(
|
client.Cmd.SendCTCPReplyf(
|
||||||
ctcp.Source.Name, CTCP_VERSION,
|
ctcp.Source.ID(), CTCP_VERSION,
|
||||||
"girc (github.com/lrstanley/girc) using %s (%s, %s)",
|
"girc (github.com/lrstanley/girc) using %s (%s, %s)",
|
||||||
runtime.Version(), runtime.GOOS, runtime.GOARCH,
|
runtime.Version(), runtime.GOOS, runtime.GOARCH,
|
||||||
)
|
)
|
||||||
|
@ -277,13 +277,13 @@ func handleCTCPVersion(client *Client, ctcp CTCPEvent) {
|
||||||
|
|
||||||
// handleCTCPSource replies with the public git location of this library.
|
// handleCTCPSource replies with the public git location of this library.
|
||||||
func handleCTCPSource(client *Client, ctcp CTCPEvent) {
|
func handleCTCPSource(client *Client, ctcp CTCPEvent) {
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_SOURCE, "https://github.com/lrstanley/girc")
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_SOURCE, "https://github.com/lrstanley/girc")
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleCTCPTime replies with a RFC 1123 (Z) formatted version of Go's
|
// handleCTCPTime replies with a RFC 1123 (Z) formatted version of Go's
|
||||||
// local time.
|
// local time.
|
||||||
func handleCTCPTime(client *Client, ctcp CTCPEvent) {
|
func handleCTCPTime(client *Client, ctcp CTCPEvent) {
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_TIME, ":"+time.Now().Format(time.RFC1123Z))
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_TIME, ":"+time.Now().Format(time.RFC1123Z))
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleCTCPFinger replies with the realname and idle time of the user. This
|
// handleCTCPFinger replies with the realname and idle time of the user. This
|
||||||
|
@ -293,5 +293,5 @@ func handleCTCPFinger(client *Client, ctcp CTCPEvent) {
|
||||||
active := client.conn.lastActive
|
active := client.conn.lastActive
|
||||||
client.conn.mu.RUnlock()
|
client.conn.mu.RUnlock()
|
||||||
|
|
||||||
client.Cmd.SendCTCPReply(ctcp.Source.Name, CTCP_FINGER, fmt.Sprintf("%s -- idle %s", client.Config.Name, time.Since(active)))
|
client.Cmd.SendCTCPReply(ctcp.Source.ID(), CTCP_FINGER, fmt.Sprintf("%s -- idle %s", client.Config.Name, time.Since(active)))
|
||||||
}
|
}
|
||||||
|
|
|
@ -516,7 +516,8 @@ const (
|
||||||
// Source represents the sender of an IRC event, see RFC1459 section 2.3.1.
|
// Source represents the sender of an IRC event, see RFC1459 section 2.3.1.
|
||||||
// <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
|
// <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
|
||||||
type Source struct {
|
type Source struct {
|
||||||
// Name is the nickname, server name, or service name.
|
// Name is the nickname, server name, or service name, in its original
|
||||||
|
// non-rfc1459 form.
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
// Ident is commonly known as the "user".
|
// Ident is commonly known as the "user".
|
||||||
Ident string `json:"ident"`
|
Ident string `json:"ident"`
|
||||||
|
@ -525,6 +526,12 @@ type Source struct {
|
||||||
Host string `json:"host"`
|
Host string `json:"host"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ID is the nickname, server name, or service name, in it's converted
|
||||||
|
// and comparable) form.
|
||||||
|
func (s *Source) ID() string {
|
||||||
|
return ToRFC1459(s.Name)
|
||||||
|
}
|
||||||
|
|
||||||
// Equals compares two Sources for equality.
|
// Equals compares two Sources for equality.
|
||||||
func (s *Source) Equals(ss *Source) bool {
|
func (s *Source) Equals(ss *Source) bool {
|
||||||
if s == nil && ss == nil {
|
if s == nil && ss == nil {
|
||||||
|
@ -533,7 +540,7 @@ func (s *Source) Equals(ss *Source) bool {
|
||||||
if s != nil && ss == nil || s == nil && ss != nil {
|
if s != nil && ss == nil || s == nil && ss != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if s.Name != ss.Name || s.Ident != ss.Ident || s.Host != ss.Host {
|
if s.ID() != ss.ID() || s.Ident != ss.Ident || s.Host != ss.Host {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -419,14 +419,16 @@ func (s *state) lookupUser(name string) *User {
|
||||||
}
|
}
|
||||||
|
|
||||||
// createUser creates the user in state, if not already done.
|
// createUser creates the user in state, if not already done.
|
||||||
func (s *state) createUser(nick string) (ok bool) {
|
func (s *state) createUser(src *Source) (ok bool) {
|
||||||
if _, ok := s.users[ToRFC1459(nick)]; ok {
|
if _, ok := s.users[src.ID()]; ok {
|
||||||
// User already exists.
|
// User already exists.
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
s.users[ToRFC1459(nick)] = &User{
|
s.users[src.ID()] = &User{
|
||||||
Nick: nick,
|
Nick: src.Name,
|
||||||
|
Host: src.Host,
|
||||||
|
Ident: src.Ident,
|
||||||
FirstSeen: time.Now(),
|
FirstSeen: time.Now(),
|
||||||
LastActive: time.Now(),
|
LastActive: time.Now(),
|
||||||
Perms: &UserPerms{channels: make(map[string]Perms)},
|
Perms: &UserPerms{channels: make(map[string]Perms)},
|
||||||
|
|
|
@ -461,7 +461,12 @@ func (cli *Client) SendStateEvent(roomID, eventType, stateKey string, contentJSO
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-text
|
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-text
|
||||||
func (cli *Client) SendText(roomID, text string) (*RespSendEvent, error) {
|
func (cli *Client) SendText(roomID, text string) (*RespSendEvent, error) {
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
return cli.SendMessageEvent(roomID, "m.room.message",
|
||||||
TextMessage{"m.text", text})
|
TextMessage{"m.text", text, "", ""})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *Client) SendHTML(roomID, textclear, text string) (*RespSendEvent, error) {
|
||||||
|
return cli.SendMessageEvent(roomID, "m.room.message",
|
||||||
|
TextMessage{"m.text", textclear, "org.matrix.custom.html", text})
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendImage sends an m.room.message event into the given room with a msgtype of m.image
|
// SendImage sends an m.room.message event into the given room with a msgtype of m.image
|
||||||
|
@ -490,7 +495,12 @@ func (cli *Client) SendVideo(roomID, body, url string) (*RespSendEvent, error) {
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-notice
|
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-notice
|
||||||
func (cli *Client) SendNotice(roomID, text string) (*RespSendEvent, error) {
|
func (cli *Client) SendNotice(roomID, text string) (*RespSendEvent, error) {
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
return cli.SendMessageEvent(roomID, "m.room.message",
|
||||||
TextMessage{"m.notice", text})
|
TextMessage{"m.notice", text, "", ""})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cli *Client) SendNoticeHTML(roomID, textclear, text string) (*RespSendEvent, error) {
|
||||||
|
return cli.SendMessageEvent(roomID, "m.room.message",
|
||||||
|
TextMessage{"m.notice", textclear, "org.matrix.custom.html", text})
|
||||||
}
|
}
|
||||||
|
|
||||||
// RedactEvent redacts the given event. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-redact-eventid-txnid
|
// RedactEvent redacts the given event. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-redact-eventid-txnid
|
||||||
|
|
|
@ -43,6 +43,8 @@ func (event *Event) MessageType() (msgtype string, ok bool) {
|
||||||
type TextMessage struct {
|
type TextMessage struct {
|
||||||
MsgType string `json:"msgtype"`
|
MsgType string `json:"msgtype"`
|
||||||
Body string `json:"body"`
|
Body string `json:"body"`
|
||||||
|
Format string `json:"format,omitempty"`
|
||||||
|
FormattedBody string `json:"formatted_body,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ImageInfo contains info about an image - http://matrix.org/docs/spec/client_server/r0.2.0.html#m-image
|
// ImageInfo contains info about an image - http://matrix.org/docs/spec/client_server/r0.2.0.html#m-image
|
||||||
|
|
|
@ -21,7 +21,7 @@ github.com/dfordsoft/golib/ic
|
||||||
github.com/dgrijalva/jwt-go
|
github.com/dgrijalva/jwt-go
|
||||||
# github.com/fsnotify/fsnotify v1.4.7
|
# github.com/fsnotify/fsnotify v1.4.7
|
||||||
github.com/fsnotify/fsnotify
|
github.com/fsnotify/fsnotify
|
||||||
# github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
|
# github.com/go-telegram-bot-api/telegram-bot-api v4.6.5-0.20181225215658-ec221ba9ea45+incompatible
|
||||||
github.com/go-telegram-bot-api/telegram-bot-api
|
github.com/go-telegram-bot-api/telegram-bot-api
|
||||||
# github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc
|
# github.com/golang/protobuf v0.0.0-20170613224224-e325f446bebc
|
||||||
github.com/golang/protobuf/proto
|
github.com/golang/protobuf/proto
|
||||||
|
@ -62,13 +62,13 @@ github.com/labstack/gommon/color
|
||||||
github.com/labstack/gommon/log
|
github.com/labstack/gommon/log
|
||||||
github.com/labstack/gommon/bytes
|
github.com/labstack/gommon/bytes
|
||||||
github.com/labstack/gommon/random
|
github.com/labstack/gommon/random
|
||||||
# github.com/lrstanley/girc v0.0.0-20181114171214-3aee8c249519
|
# github.com/lrstanley/girc v0.0.0-20190102153329-c1e59a02f488
|
||||||
github.com/lrstanley/girc
|
github.com/lrstanley/girc
|
||||||
# github.com/magiconair/properties v1.8.0
|
# github.com/magiconair/properties v1.8.0
|
||||||
github.com/magiconair/properties
|
github.com/magiconair/properties
|
||||||
# github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
# github.com/matterbridge/go-xmpp v0.0.0-20180529212104-cd19799fba91
|
||||||
github.com/matterbridge/go-xmpp
|
github.com/matterbridge/go-xmpp
|
||||||
# github.com/matterbridge/gomatrix v0.0.0-20171224233421-78ac6a1a0f5f
|
# github.com/matterbridge/gomatrix v0.0.0-20190102230110-6f9631ca6dea
|
||||||
github.com/matterbridge/gomatrix
|
github.com/matterbridge/gomatrix
|
||||||
# github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544
|
# github.com/matterbridge/gozulipbot v0.0.0-20180507190239-b6bb12d33544
|
||||||
github.com/matterbridge/gozulipbot
|
github.com/matterbridge/gozulipbot
|
||||||
|
|
Loading…
Reference in New Issue