Skip to content

Commit 9a613e4

Browse files
committed
cs2 WIP
1 parent c22301d commit 9a613e4

File tree

3 files changed

+15
-298
lines changed

3 files changed

+15
-298
lines changed

main.go

Lines changed: 0 additions & 207 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,15 @@
11
package main
22

33
import (
4-
"compress/gzip"
54
"csgo-2d-demo-player/conf"
6-
"csgo-2d-demo-player/pkg/auth"
7-
"csgo-2d-demo-player/pkg/list"
85
"csgo-2d-demo-player/pkg/log"
9-
"csgo-2d-demo-player/pkg/message"
10-
"csgo-2d-demo-player/pkg/parser"
116
"csgo-2d-demo-player/pkg/provider/faceit"
127
"csgo-2d-demo-player/pkg/provider/steam"
13-
"encoding/json"
148
"fmt"
15-
"io"
169
"net/http"
1710

1811
"github.com/alexflint/go-arg"
19-
"github.com/gorilla/websocket"
20-
"github.com/markus-wa/demoinfocs-golang/v3/pkg/demoinfocs"
2112
"go.uber.org/zap"
22-
"google.golang.org/protobuf/proto"
2313
)
2414

2515
var config *conf.Conf
@@ -34,213 +24,16 @@ func main() {
3424
defer log.Close()
3525

3626
log.L().Debug("using config", zap.Any("config", config))
37-
faceitClient = faceit.NewFaceitClient(config)
38-
steamClient = steam.NewSteamClient(config)
39-
// log.Printf("using config %+v", config)
4027
server()
4128
}
4229

43-
func handleMessages(in chan []byte, out chan []byte) {
44-
for msg := range in {
45-
var messageObj message.Message
46-
err := json.Unmarshal(msg, &messageObj)
47-
if err != nil {
48-
log.Print("failed unmarshal websocket message", err)
49-
}
50-
switch messageObj.MsgType {
51-
case message.Message_PlayRequestType:
52-
go playDemo(out, messageObj.Demo.MatchId)
53-
}
54-
}
55-
}
56-
5730
func server() {
5831
mux := http.NewServeMux()
5932

6033
mux.Handle("/assets/", http.StripPrefix("/assets", http.FileServer(http.Dir("./assets"))))
6134
mux.Handle("/", http.FileServer(http.Dir("web/index/build")))
62-
mux.Handle("/player/", http.StripPrefix("/player", http.FileServer(http.Dir("web/player/build"))))
63-
64-
listService := list.ListService{
65-
Conf: config,
66-
FaceitClient: faceitClient,
67-
}
68-
mux.HandleFunc("/match/list", listService.ListMatches)
69-
mux.HandleFunc("/match/detail", listService.MatchDetails)
70-
71-
// faceit auth
72-
mux.HandleFunc("/auth/faceit/login", faceitClient.LoginHandler)
73-
mux.HandleFunc("/auth/faceit/callback", faceitClient.OAuthCallbackHandler)
74-
mux.HandleFunc("/auth/faceit/logout", faceitClient.LogoutHandler)
75-
mux.Handle("/faceit/api/", http.StripPrefix("/faceit/api/", faceitClient))
76-
77-
// steam auth
78-
mux.HandleFunc("/auth/steam/login", steamClient.LoginHandler)
79-
mux.HandleFunc("/auth/steam/callback", steamClient.OAuthCallbackHandler)
80-
mux.HandleFunc("/auth/steam/logout", steamClient.LogoutHandler)
81-
82-
mux.HandleFunc("/auth/whoami", func(w http.ResponseWriter, r *http.Request) {
83-
if config.Mode == conf.MODE_DEV {
84-
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
85-
w.Header().Set("Access-Control-Allow-Credentials", "true")
86-
}
87-
88-
faceitAuth, err := auth.GetAuthCookie(faceit.FaceitAuthCookieName, r, &auth.FaceitAuthInfo{})
89-
if err != nil {
90-
log.L().Info("some error getting the cookie, why???", zap.Error(err))
91-
// http.Error(writer, err.Error(), 500)
92-
}
93-
// log.L().Info("cookie", zap.Any("cok", authCookie))
94-
type whoamiInfo struct {
95-
FaceitNickname string `json:"faceitNickname,omitempty"`
96-
FaceitGuid string `json:"faceitGuid,omitempty"`
97-
SteamId string `json:"steamId,omitempty"`
98-
SteamName string `json:"steamUsername,omitempty"`
99-
SteamAvatar string `json:"steamAvatar,omitempty"`
100-
}
101-
whoami := whoamiInfo{}
102-
if faceitAuth != nil {
103-
whoami.FaceitNickname = faceitAuth.UserInfo.Nickname
104-
whoami.FaceitGuid = faceitAuth.UserInfo.Guid
105-
}
106-
107-
steamAuth, err := auth.GetAuthCookie(steam.SteamAuthCookieName, r, &auth.SteamAuthInfo{})
108-
if err != nil {
109-
log.L().Info("some error getting the cookie, why???", zap.Error(err))
110-
// http.Error(writer, err.Error(), 500)
111-
}
112-
if steamAuth != nil {
113-
whoami.SteamId = steamAuth.UserId
114-
whoami.SteamName = steamAuth.Username
115-
whoami.SteamAvatar = steamAuth.AvatarUrl
116-
}
117-
118-
if whoamiJson, errMarshal := json.Marshal(whoami); errMarshal != nil {
119-
log.L().Error("failed to marshall whoami info", zap.Error(errMarshal))
120-
} else {
121-
_, errWrite := w.Write(whoamiJson)
122-
if errWrite != nil {
123-
log.L().Error("failed to write response", zap.Error(errWrite))
124-
w.WriteHeader(http.StatusServiceUnavailable)
125-
}
126-
}
127-
})
128-
129-
mux.HandleFunc("/ws", func(writer http.ResponseWriter, request *http.Request) {
130-
// Upgrade our raw HTTP connection to a websocket based one
131-
upgrader := websocket.Upgrader{}
132-
if request.Host == "localhost:8080" {
133-
upgrader.CheckOrigin = func(r *http.Request) bool {
134-
return true
135-
}
136-
}
137-
conn, err := upgrader.Upgrade(writer, request, nil)
138-
if err != nil {
139-
log.Print("Error during connection upgradation:", err)
140-
return
141-
}
142-
143-
out := make(chan []byte)
144-
in := make(chan []byte)
145-
go handleMessages(in, out)
146-
147-
// out routine
148-
go func() {
149-
defer func() {
150-
if closeErr := conn.Close(); closeErr != nil {
151-
log.Printf("failed to close connection [out] '%s'", closeErr.Error())
152-
}
153-
}()
154-
155-
for msg := range out {
156-
err = conn.WriteMessage(websocket.BinaryMessage, msg)
157-
if err != nil {
158-
log.Println("Error during message writing:", err)
159-
break
160-
}
161-
}
162-
}()
163-
164-
// in routine
165-
go func() {
166-
defer func() {
167-
if closeErr := conn.Close(); closeErr != nil {
168-
log.Printf("failed to close connection [in] '%s'", closeErr.Error())
169-
}
170-
}()
171-
172-
for {
173-
_, msg, err := conn.ReadMessage()
174-
if err != nil {
175-
closeErr, isCloseErr := err.(*websocket.CloseError)
176-
if !isCloseErr || closeErr.Code != websocket.CloseGoingAway {
177-
log.Println("Error during message reading: ", err)
178-
}
179-
break
180-
}
181-
in <- msg
182-
}
183-
}()
184-
})
18535
log.L().Info("HTTP server listening on ...", zap.String("listen", config.Listen), zap.Int("port", config.Port))
18636
// log.Println("Listening on ", config.Port, " ...")
18737
listenErr := http.ListenAndServe(fmt.Sprintf("%s:%d", config.Listen, config.Port), mux)
18838
log.L().Fatal("failed to listen", zap.Error(listenErr))
18939
}
190-
191-
func playDemo(out chan []byte, matchId string) {
192-
log.L().Info("playing faceit demo", zap.String("matchId", matchId))
193-
if matchId == "" {
194-
sendError("no matchId", out)
195-
return
196-
}
197-
demoFile, closers, err := obtainDemoFile(matchId)
198-
if err != nil {
199-
sendError(err.Error(), out)
200-
return
201-
}
202-
defer func() {
203-
for _, c := range closers {
204-
if closeErr := c.Close(); closeErr != nil {
205-
log.Printf("[%s] failed to close resource. %s", matchId, closeErr)
206-
}
207-
}
208-
}()
209-
err = parser.Parse(demoFile, func(msg *message.Message, tick demoinfocs.GameState) {
210-
sendMessage(msg, out)
211-
})
212-
if err != nil {
213-
sendError(err.Error(), out)
214-
}
215-
}
216-
217-
func sendMessage(msg *message.Message, out chan []byte) {
218-
payload, protoErr := proto.Marshal(msg)
219-
if protoErr != nil {
220-
sendError(protoErr.Error(), out)
221-
}
222-
out <- payload
223-
}
224-
225-
func sendError(errorMessage string, out chan []byte) {
226-
log.Printf("sending error to client: '%s'", errorMessage)
227-
out <- []byte(fmt.Sprintf("{\"msgType\": %d, \"error\": {\"message\": \"%s\"}}", message.Message_ErrorType, errorMessage))
228-
}
229-
230-
func obtainDemoFile(matchId string) (io.Reader, []io.Closer, error) {
231-
closers := make([]io.Closer, 0)
232-
233-
demoFileReader, streamErr := faceitClient.DemoStream(matchId)
234-
if streamErr != nil {
235-
return nil, closers, streamErr
236-
}
237-
closers = append(closers, demoFileReader)
238-
239-
gzipReader, gzipErr := gzip.NewReader(demoFileReader)
240-
if gzipErr != nil {
241-
log.Printf("[%s] Failed to create gzip reader from demo. %s", matchId, gzipErr)
242-
return nil, closers, gzipErr
243-
}
244-
closers = append(closers, gzipReader)
245-
return gzipReader, closers, gzipErr
246-
}

web/index/public/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ a:hover {
55
a {
66
text-decoration-line: none;
77
}
8+
9+
body {
10+
background-image: url("https://media3.giphy.com/media/toXKzaJP3WIgM/giphy.gif?cid=ecf05e478tqmsss7kgqovsqp0a8qbkfcf72svqjievr53jp2");
11+
}

web/index/src/App.js

Lines changed: 11 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,19 @@
1-
import { useEffect, useState } from 'react';
21
import './App.css';
3-
import MatchTable from './MatchTable/MatchTable';
42

53
function App() {
6-
const [auth, setAuth] = useState([]);
7-
const [serverHost] = useState(window.location.host.includes("localhost") ? "http://localhost:8080" : "")
8-
const [content, setContent] = useState([]);
9-
10-
useEffect(() => {
11-
if (Object.keys(auth).length > 0) {
12-
setContent(<MatchTable auth={auth} serverHost={serverHost} />)
13-
return
14-
}
15-
setContent(<span className="material-icons w3-xxxlarge rotate">autorenew</span>)
16-
17-
fetch(serverHost + "/auth/whoami", { credentials: "include" })
18-
.then(response => response.json())
19-
.then(data => {
20-
if (Object.keys(data).length > 0) {
21-
setAuth(data)
22-
} else {
23-
setContent(<span className="w3-xxxlarge rotate">Connect account first</span>)
24-
}
25-
})
26-
.catch(err => {
27-
console.log(err)
28-
setContent(<span className="w3-xxxlarge rotate">failed to contact server ...</span>)
29-
})
30-
}, [serverHost, auth])
31-
32-
let faceitAuth = (
33-
<div className='faceitAuth'>
34-
<a href={serverHost + "/auth/faceit/login"}>
35-
Connect FACEIT <img src="https://upload.wikimedia.org/wikipedia/commons/5/52/Cib-faceit_%28CoreUI_Icons_v1.0.0%29.svg" height="32" alt="faceit-logo" />
36-
</a>
37-
</div>)
38-
let steamAuth = (
39-
<div className='steamAuth'>
40-
<a href={serverHost + "/auth/steam/login"}>
41-
Connect Steam <img src='https://upload.wikimedia.org/wikipedia/commons/8/83/Steam_icon_logo.svg' height="32" alt="steam-login" />
42-
</a>
43-
</div>
44-
)
45-
if (Object.keys(auth).length > 0) {
46-
if (auth.faceitNickname) {
47-
faceitAuth = (
48-
<div className='faceitAuth'>
49-
<a href={"https://www.faceit.com/en/players/" + auth.faceitNickname} target="_blank" rel="noreferrer">
50-
<img src="/assets/faceit-logo.svg" alt="faceit-logo" height="32" /><span id="faceitNickname">{auth.faceitNickname}</span>
51-
</a>
52-
<a className="material-icons w3-large" href={serverHost + "/auth/faceit/logout"}>logout</a>
4+
return (
5+
<div className="w3-container w3-margin-top">
6+
<div className="w3-row w3-center">
7+
<div className="w3-quarter">
8+
&nbsp;
539
</div>
54-
)
55-
}
56-
if (auth.steamId) {
57-
steamAuth = (
58-
<div className='steamAuth'>
59-
<a href={"https://steamcommunity.com/profiles/" + auth.steamId} target="_blank" rel="noreferrer">
60-
<img src={auth.steamAvatar} height="32" alt="steam-login" /><span id="steamNickname">{auth.steamUsername}</span>
61-
</a>
62-
<a className="material-icons w3-large" href={serverHost + "/auth/steam/logout"}>logout</a>
10+
<div className="w3-half w3-display-container w3-cell-middle">
11+
<img
12+
src="https://media3.giphy.com/media/4VRgyzM90w0SoT5BV9/giphy.gif?cid=ecf05e47dnwcxzy13u09zyd37843vdgifb9d5bf9d467crti"
13+
className="w3-circle w3-border-blue-gray w3-hover-border-gray w3-padding w3-leftbar w3-rightbar" alt="cs2" style={{width:'100%'}} />
6314
</div>
64-
)
65-
}
66-
}
67-
68-
return (
69-
<div className="App">
70-
<div className="w3-container">
71-
<div className="w3-row">
72-
<div className="w3-col l2">
73-
<br />
74-
</div>
75-
<div className="w3-col l8">
76-
<div className="w3-container w3-xlarge w3-light-grey">
77-
<div className="w3-row">
78-
<div className="w3-col l4 w3-left-align">
79-
<a href="/"><h1>2d.sparko.cz</h1></a>
80-
</div>
81-
<div className='w3-col l4'>
82-
&nbsp;
83-
</div>
84-
<div className="w3-col l4 w3-right-align">
85-
<div className='faceit'>{faceitAuth}</div>
86-
<div className='steam'>{steamAuth}</div>
87-
</div>
88-
</div>
89-
</div>
90-
<div id="searchNote" className="w3-margin w3-container w3-center loader w3-xlarge">
91-
</div>
92-
{content}
93-
</div>
94-
<div className="w3-col l2">
95-
<br />
96-
</div>
15+
<div className="w3-quarter">
16+
&nbsp;
9717
</div>
9818
</div>
9919
</div>

0 commit comments

Comments
 (0)