У меня действительно проблема.Так что я на самом деле создал программу, которая использует диссон-ботов и веб-сокеты.Я хочу отправлять сообщения о разногласиях из веб-чата и отправлять сообщения о разногласиях в веб-чат.И сейчас, когда я отправляю сообщение, все хорошо отправлено, но не так, как я планировал.Прямо сейчас сообщение, полученное с разногласий, показывается только тогда, когда сообщение написано в веб-чате.Как я могу решить это?Вот код
main.go
package main
import (
"fmt"
"./bot"
"./config"
"./sockets"
)
func main() {
err := config.ReadConfig()
if err != nil {
fmt.Println(err.Error())
return
}
bot.Start()
sockets.RunSockets()
return
}
bot.go
package bot
import (
"fmt"
"../config"
"github.com/bwmarrin/discordgo"
)
var (
// BotID contains the ID of the bot
BotID string
discord *discordgo.Session
// Websockets contains all of data that are going to be sent to Server
Websockets WebsocketStruct
socketsDatas WebData
)
// WebData contains the datas coming from Web
type WebData struct {
Message string
Nickname string
}
// WebsocketStruct contains how the websocket will recieve the datas
type WebsocketStruct struct {
DiscordMessage string
DiscordUser string
}
// Start the bot
func Start() {
discord, err := discordgo.New("Bot " + config.Token)
if err != nil {
fmt.Println(err.Error())
return
}
u, err := discord.User("@me")
if err != nil {
fmt.Println(err.Error())
}
discord.AddHandler(messageHandler)
discord.ChannelMessageSend("516626040622284802", socketsDatas.Nickname+" said from chat: "+socketsDatas.Message)
BotID = u.ID
err = discord.Open()
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("Bot is now running")
}
func messageHandler(session *discordgo.Session, msg *discordgo.MessageCreate) {
if msg.Author.ID == BotID {
return
}
Websockets.DiscordMessage = msg.Content
Websockets.DiscordUser = msg.Author.Username
}
// RecieveData function is meant to recieve datas from the web
func RecieveData(datas WebData) {
socketsDatas = datas
}
websockets.go
package sockets
import (
"fmt"
"net/http"
"sync"
"../bot"
"golang.org/x/net/websocket"
)
// Data structure
type Data struct {
Message string `json:"message"`
Nickname string `json:"nickname"`
}
var (
count = 0
hub = make(map[int]*websocket.Conn)
mutex = &sync.Mutex{}
// Webdatas contains the struct that the bot needs to recieve messages from Web
Webdatas bot.WebData
)
// RunSockets is made for running sockets
func RunSockets() {
fmt.Println("Server started")
http.Handle("/connws/", websocket.Handler(func(ws *websocket.Conn) {
current := connexion(ws)
fmt.Println("The hub:", hub)
var data Data
for {
err := websocket.JSON.Receive(ws, &data)
if err != nil {
delete(hub, current)
ws.Close()
fmt.Println("The hub:", hub)
return
}
for _, i := range hub {
discordMessage := bot.Websockets
if discordMessage.DiscordMessage != "" && discordMessage.DiscordUser != "" {
go websocket.Message.Send(i, discordMessage.DiscordUser+" said from Discord: "+discordMessage.DiscordMessage+"<br>")
}
_ = websocket.Message.Send(i, string(data.Nickname+" said: "+data.Message+"<br>"))
Webdatas.Message = data.Message
Webdatas.Nickname = data.Nickname
bot.RecieveData(Webdatas)
}
}
}))
http.ListenAndServe(":47563", nil)
}
func connexion(ws *websocket.Conn) int {
mutex.Lock()
hub[count] = ws
current := count
count++
mutex.Unlock()
return current
}
Спасибо за помощь:)