mirror of
				https://github.com/klmp200/kaamelott-soundboard-telegram-bot
				synced 2025-10-31 00:53:11 +00:00 
			
		
		
		
	Maintenant il parle avec telegram
This commit is contained in:
		
							
								
								
									
										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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user