115 lines
2.8 KiB
Go
115 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/gorilla/mux"
|
|
"log"
|
|
"math/rand"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// Message struct
|
|
type Text struct {
|
|
Content string `json:"content"`
|
|
Author string `json:"author"`
|
|
}
|
|
|
|
type Message struct {
|
|
Id string `json:"id"`
|
|
Content Text `json:"content"`
|
|
}
|
|
|
|
// Chat as a slice of Messages
|
|
var chat []Message
|
|
|
|
// Possible Messages
|
|
var quickchat []string
|
|
|
|
//Possible authors
|
|
var users []string
|
|
|
|
var idCount int
|
|
|
|
func getChat(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(writer).Encode(chat)
|
|
}
|
|
func getMsg(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
params := mux.Vars(request)
|
|
for _, msg := range chat {
|
|
if msg.Id == params["id"] {
|
|
json.NewEncoder(writer).Encode(msg)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func createMsg() (string, string) {
|
|
content := quickchat[rand.Intn(len(quickchat))]
|
|
author := users[rand.Intn(len(users))]
|
|
|
|
return content, author
|
|
}
|
|
|
|
func sendMsg(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
var newMsg Message
|
|
_ = json.NewDecoder(request.Body).Decode(&(newMsg.Content))
|
|
newMsg.Id = strconv.Itoa(idCount)
|
|
idCount++
|
|
chat = append(chat, newMsg)
|
|
json.NewEncoder(writer).Encode(newMsg)
|
|
fmt.Println("New Message:")
|
|
fmt.Println("#", newMsg.Id, newMsg.Content.Author, ":", newMsg.Content.Content)
|
|
}
|
|
func editMsg(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
|
|
}
|
|
func deleteMsg(writer http.ResponseWriter, request *http.Request) {
|
|
writer.Header().Set("Content-Type", "application/json")
|
|
|
|
params := mux.Vars(request)
|
|
for index, msg := range chat {
|
|
if msg.Id == params["id"] {
|
|
chat = append(chat[:index], chat[index+1:]...)
|
|
break
|
|
}
|
|
}
|
|
json.NewEncoder(writer).Encode(chat)
|
|
}
|
|
|
|
func main() {
|
|
// Init rand
|
|
rand.Seed(time.Now().Unix())
|
|
|
|
// Init server router
|
|
router := mux.NewRouter()
|
|
|
|
// Init chat variables
|
|
quickchat = []string{"Wow!", "OMG!", "Nice shot!", "What a save!", "Sorry!", "My bad."}
|
|
users = []string{"Chipper", "Beast", "Jester", "Merlin", "Bandit", "Rainmaker"}
|
|
|
|
first := Message{"0", Text{"The chat room is open.", "SERVER"}}
|
|
chat = append(chat, first)
|
|
idCount = 1
|
|
|
|
// Handlers
|
|
router.HandleFunc("/api/chat", getChat).Methods("GET")
|
|
router.HandleFunc("/api/chat/{id}", getMsg).Methods("GET")
|
|
router.HandleFunc("/api/chat", sendMsg).Methods("POST")
|
|
router.HandleFunc("/api/chat/{id}", editMsg).Methods("PUT")
|
|
router.HandleFunc("/api/chat/{id}", deleteMsg).Methods("DELETE")
|
|
|
|
// Log
|
|
log.Fatal(http.ListenAndServe(":8000", router))
|
|
|
|
last := Message{"-1", Text{"The chat room is closed.", "SERVER"}}
|
|
chat = append(chat, last)
|
|
|
|
return
|
|
}
|