Add web portion

This commit is contained in:
Brandon Sturgeon 2021-02-14 21:47:58 -08:00
parent 2584c6c0ce
commit 41e2e720d8
7 changed files with 188 additions and 0 deletions

24
web/Dockerfile Normal file
View File

@ -0,0 +1,24 @@
FROM golang:1.15.4-alpine as builder
ENV GOPATH=/build
ENV GOBIN=/usr/local/go/bin
ENV GO111MODULE=on
WORKDIR $GOPATH/src
COPY . .
ARG BRANCH=HEAD
RUN go mod init cfc_chat_relay\
&& go get github.com/gorilla/websocket@$BRANCH \
&& go get github.com/bwmarrin/discordgo@$BRANCH \
&& go list -m all \
&& go fmt \
&& CGO_ENABLED=0 GOOS=linux go build -a -o cfc_chat_relay . \
&& cp cfc_chat_relay $GOPATH/.
CMD [ "/build/cfc_chat_relay" ]
FROM alpine:3.11.3
COPY --from=builder /build/cfc_chat_relay .
CMD [ "./cfc_chat_relay" ]

25
web/client.py Normal file
View File

@ -0,0 +1,25 @@
import asyncio
import websockets
import json
message = json.dumps({
"content": "Message content",
"realm": "CFC3",
"rankColor": 16711680,
"avatar": "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/c3/c3364b63359c0c8d0c1b3cca74eb5768e533b366_full.jpg",
"steamName": "Phatso",
"steamId": "1234567890",
"irisId": "09876"
})
async def hello():
uri = "ws://0.0.0.0:5050/relay"
async with websockets.connect(uri) as websocket:
await websocket.send(message)
print(f"> {message}")
greeting = await websocket.recv()
print(f"< {greeting}")
asyncio.get_event_loop().run_until_complete(hello())

View File

10
web/docker-compose.yml Normal file
View File

@ -0,0 +1,10 @@
version: "3.8"
services:
web:
build: .
ports:
- "$PORT:8080"
env_file:
- .env
volumes:
- ./:/build/src

18
web/main.go Normal file
View File

@ -0,0 +1,18 @@
package main
import (
"flag"
"log"
"net/http"
)
func main() {
addr := flag.String("addr", "0.0.0.0:8080", "http service address")
flag.Parse()
//log.SetFlags(0)
http.HandleFunc("/relay", relay)
go queueGroomer()
log.Fatal(http.ListenAndServe(*addr, nil))
}

75
web/queue.go Normal file
View File

@ -0,0 +1,75 @@
package main
import (
"log"
"encoding/json"
"github.com/bwmarrin/discordgo"
"os"
)
var discord *discordgo.Session
type MessageStruct struct{
Realm string
Content string
RankColor int
Avatar string
SteamName string
SteamId string
IrisId string
}
var MessageQueue = make(chan []byte, 100)
var WebhookId string = os.Getenv("WEBHOOK_ID")
var WebhookSecret string = os.Getenv("WEBHOOK_SECRET")
func sendEmbed(discord *discordgo.Session, message MessageStruct) {
params := &discordgo.WebhookParams{
Content: "",
Embeds: []*discordgo.MessageEmbed{
{
Title: "Said on " + message.Realm,
Description: message.Content,
Color: message.RankColor,
Author: &discordgo.MessageEmbedAuthor{
URL: "https://steamcommunity.com/profiles/" + message.SteamId,
Name: message.SteamName,
IconURL: message.Avatar,
},
},
},
}
discord.WebhookExecute(WebhookId, WebhookSecret, true, params)
//discord.WebhookExecute("810674008244092930", "90iO4UnmHQ_W9HFVycr50us1R0JMDd_wmDWqyVXt_d-jpuLK_6WwWOYDar6OLV-ymkIz", true, params)
}
func queueGroomer() {
discord, err := discordgo.New("")
log.Print(WebhookId, WebhookSecret)
if err != nil {
log.Fatal("error connecting:", err)
return
}
log.Print("Successfully connected to Discord")
for {
rawMessage := <-MessageQueue
log.Print("Received message from queue: ", string(rawMessage))
var message MessageStruct
if err := json.Unmarshal(rawMessage, &message); err != nil {
panic(err)
}
log.Print(message.SteamName, message.SteamId, message.Content)
sendEmbed(discord, message)
}
}

36
web/relay.go Normal file
View File

@ -0,0 +1,36 @@
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{}
func relay(w http.ResponseWriter, r *http.Request) {
// TODO: Prevent multiple clients here
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
select {
case MessageQueue <- message:
// okay
default:
log.Print("Queue was full, could not add message!", string(message))
}
}
}