Сообщения Websocket отправляются только тогда, когда я отправляю сообщение из оригинального чата - PullRequest
0 голосов
/ 17 декабря 2018

У меня действительно проблема.Так что я на самом деле создал программу, которая использует диссон-ботов и веб-сокеты.Я хочу отправлять сообщения о разногласиях из веб-чата и отправлять сообщения о разногласиях в веб-чат.И сейчас, когда я отправляю сообщение, все хорошо отправлено, но не так, как я планировал.Прямо сейчас сообщение, полученное с разногласий, показывается только тогда, когда сообщение написано в веб-чате.Как я могу решить это?Вот код
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
}

Спасибо за помощь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...