mirror of
https://github.com/klmp200/kaamelott-soundboard-telegram-bot
synced 2024-12-21 23:21:08 +00:00
Maintenant il parle avec telegram
This commit is contained in:
parent
b20f1b708a
commit
930386892d
1
.gitignore
vendored
1
.gitignore
vendored
@ -38,4 +38,5 @@ Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
settings.json
|
||||
kaamelott-soundboard-telegram-bot
|
||||
|
141
bot.go
141
bot.go
@ -5,62 +5,137 @@ import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/blevesearch/bleve"
|
||||
tb "gopkg.in/tucnak/telebot.v2"
|
||||
)
|
||||
|
||||
// Sound description d'un son
|
||||
type Sound struct {
|
||||
Character string `json:"character"`
|
||||
Episode string `json:"episode"`
|
||||
File string `json:"file"`
|
||||
Title string `json:"title"`
|
||||
type settings struct {
|
||||
ListeningAddress string `json:"listening_address"`
|
||||
Domain string `json:"domain"`
|
||||
TelegramKey string `json:"telegram_key"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
const (
|
||||
soundDatabase = "./sounds/sounds.json"
|
||||
soundFolderPrefix = "./sounds"
|
||||
defaultlisteningAddress = "0.0.0.0:8080"
|
||||
defaultDomain = "http://localhost:8080"
|
||||
defaultTelegramKey = "nope"
|
||||
)
|
||||
|
||||
var sounds []Sound
|
||||
var index *SoundIndex
|
||||
var cfg *settings
|
||||
|
||||
jsonFile, err := os.Open("sounds.json")
|
||||
func loadSettings(path string) (*settings, error) {
|
||||
loaded := settings{
|
||||
ListeningAddress: defaultlisteningAddress,
|
||||
Domain: defaultDomain,
|
||||
TelegramKey: defaultTelegramKey,
|
||||
}
|
||||
|
||||
jsonFile, err := os.Open(path)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
log.Printf("non trouvé mais c'est pas grave on fait sans")
|
||||
return &loaded, nil
|
||||
}
|
||||
|
||||
byteData, err := ioutil.ReadAll(jsonFile)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
return nil, fmt.Errorf("Je peux pas le lire ton fichier %s > %w", path, err)
|
||||
}
|
||||
|
||||
if json.Unmarshal(byteData, &sounds) != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
if json.Unmarshal(byteData, &loaded) != nil {
|
||||
return nil, fmt.Errorf("Ton json %s il est tout pété > %w", path, err)
|
||||
}
|
||||
|
||||
mapping := bleve.NewIndexMapping()
|
||||
index, err := bleve.NewMemOnly(mapping)
|
||||
return &loaded, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
cfg, err := loadSettings("settings.json")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, sound := range sounds {
|
||||
if index.Index(sound.File, sound) != nil {
|
||||
log.Printf("Error d'indexion de %v", sound)
|
||||
index, err := loadAndIndexSounds(soundDatabase)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
b, err := tb.NewBot(tb.Settings{
|
||||
Token: cfg.TelegramKey,
|
||||
Poller: &tb.LongPoller{Timeout: 10 * time.Second},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
|
||||
fs := http.FileServer(http.Dir(soundFolderPrefix))
|
||||
http.Handle("/", fs)
|
||||
|
||||
log.Printf("Écoute sur %s...", cfg.ListeningAddress)
|
||||
go http.ListenAndServe(cfg.ListeningAddress, nil)
|
||||
|
||||
b.Handle("/cite", func(m *tb.Message) {
|
||||
sounds, err := index.Search(m.Text)
|
||||
if err != nil {
|
||||
b.Send(m.Chat, "Pas de fichier audio trouvé")
|
||||
return
|
||||
}
|
||||
}
|
||||
path := fmt.Sprintf("%s/%s", soundFolderPrefix, sounds[0].File)
|
||||
_, err = b.Send(
|
||||
m.Chat,
|
||||
&tb.Audio{
|
||||
File: tb.FromDisk(path),
|
||||
Caption: sounds[0].Title,
|
||||
Title: sounds[0].Episode,
|
||||
Performer: sounds[0].Character,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
log.Panicf("Impossible d'envoyer le fichier %s: %s", path, err)
|
||||
b.Send(m.Chat, "Erreur d'envoi du fichier")
|
||||
}
|
||||
})
|
||||
|
||||
query := bleve.NewMatchQuery("cul")
|
||||
search := bleve.NewSearchRequest(query)
|
||||
searchResults, err := index.Search(search)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return
|
||||
}
|
||||
for _, file := range searchResults.Hits {
|
||||
fmt.Println(file.ID)
|
||||
}
|
||||
b.Handle(tb.OnQuery, func(q *tb.Query) {
|
||||
sounds, err := index.Search(q.Text)
|
||||
if err != nil {
|
||||
log.Println("Pas de fichier audio trouvé")
|
||||
return
|
||||
}
|
||||
results := make(tb.Results, len(sounds))
|
||||
for i, sound := range sounds {
|
||||
url := fmt.Sprintf("%s/%s", cfg.Domain, sound.File)
|
||||
log.Println(url)
|
||||
results[i] = &tb.AudioResult{
|
||||
URL: url,
|
||||
Caption: sound.Episode,
|
||||
Title: sound.Title,
|
||||
Performer: sound.Character,
|
||||
}
|
||||
results[i].SetResultID(strconv.Itoa(i))
|
||||
}
|
||||
err = b.Answer(q, &tb.QueryResponse{
|
||||
Results: results,
|
||||
SwitchPMParameter: "Ajoute moi",
|
||||
CacheTime: 60, // une minute
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
})
|
||||
|
||||
b.Start()
|
||||
|
||||
}
|
||||
|
5
go.mod
5
go.mod
@ -2,4 +2,7 @@ module github.com/klmp200/kaamelott-soundboard-telegram-bot
|
||||
|
||||
go 1.14
|
||||
|
||||
require github.com/blevesearch/bleve v1.0.7
|
||||
require (
|
||||
github.com/blevesearch/bleve v1.0.7
|
||||
gopkg.in/tucnak/telebot.v2 v2.0.0-20200426184946-59629fe0483e
|
||||
)
|
||||
|
5
go.sum
5
go.sum
@ -55,6 +55,8 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
@ -69,6 +71,7 @@ github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
|
||||
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||
@ -91,5 +94,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/tucnak/telebot.v2 v2.0.0-20200426184946-59629fe0483e h1:b9xwpngyOzAgWsFzw+kknHd/XZAnEsohHcGfu+z/LZA=
|
||||
gopkg.in/tucnak/telebot.v2 v2.0.0-20200426184946-59629fe0483e/go.mod h1:+2HaHCMjzfvC3MVOSmgRKeAPruYl4PEcSxywvP8GipU=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
88
index.go
Normal file
88
index.go
Normal file
@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/blevesearch/bleve"
|
||||
)
|
||||
|
||||
// Sound description d'un son de la soundbox
|
||||
type Sound struct {
|
||||
Character string `json:"character"`
|
||||
Episode string `json:"episode"`
|
||||
File string `json:"file"`
|
||||
Title string `json:"title"`
|
||||
}
|
||||
|
||||
// SoundIndex Aide à la recherche de son
|
||||
type SoundIndex struct {
|
||||
index bleve.Index
|
||||
Sounds []Sound
|
||||
soundsByFile map[string]Sound // soundsMap[fileName]
|
||||
}
|
||||
|
||||
// Search recherche un son dans l'index
|
||||
func (si *SoundIndex) Search(str string) ([]Sound, error) {
|
||||
var resp []Sound
|
||||
|
||||
query := bleve.NewMatchQuery(str)
|
||||
req := bleve.NewSearchRequest(query)
|
||||
searchResults, err := si.index.Search(req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("erreur dans la requête > %w", err)
|
||||
}
|
||||
for _, hit := range searchResults.Hits {
|
||||
if sound, ok := si.soundsByFile[hit.ID]; ok {
|
||||
resp = append(resp, sound)
|
||||
}
|
||||
}
|
||||
|
||||
if len(resp) == 0 {
|
||||
return nil, fmt.Errorf("pas de fichier trouvé")
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func loadAndIndexSounds(path string) (*SoundIndex, error) {
|
||||
|
||||
var sounds []Sound
|
||||
soundMap := make(map[string]Sound)
|
||||
|
||||
jsonFile, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ouverture de la base de sons > %w", err)
|
||||
}
|
||||
|
||||
byteData, err := ioutil.ReadAll(jsonFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("lecture de la base de sons > %w", err)
|
||||
}
|
||||
|
||||
if json.Unmarshal(byteData, &sounds) != nil {
|
||||
return nil, fmt.Errorf("lecture de la base des sons > %w", err)
|
||||
}
|
||||
|
||||
mapping := bleve.NewIndexMapping()
|
||||
index, err := bleve.NewMemOnly(mapping)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("création de l'indexeur > %w", err)
|
||||
}
|
||||
|
||||
for _, sound := range sounds {
|
||||
if index.Index(sound.File, sound) != nil {
|
||||
log.Printf("Error d'indexion de %v", sound)
|
||||
}
|
||||
soundMap[sound.File] = sound
|
||||
}
|
||||
|
||||
return &SoundIndex{
|
||||
index,
|
||||
sounds,
|
||||
soundMap,
|
||||
}, nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user