Compare commits

...

2 Commits

2 changed files with 38 additions and 40 deletions

View File

@ -42,8 +42,7 @@ func clearTerminal() {
cmd.Run() cmd.Run()
} }
// calculateRatio is a helper function to calculate ratios (e.g., WLR, KDR, etc.) func calcRatio(numerator, denominator int) float64 {
func calculateRatio(numerator, denominator int) float64 {
if denominator == 0 { if denominator == 0 {
return float64(numerator) return float64(numerator)
} }
@ -104,23 +103,29 @@ func (app *DemoApp) onFileEmit(line string) {
if strings.HasPrefix(submsg, OnlinePrefix) { // Online Message if strings.HasPrefix(submsg, OnlinePrefix) { // Online Message
newsubmsg := strings.TrimPrefix(submsg, OnlinePrefix) newsubmsg := strings.TrimPrefix(submsg, OnlinePrefix)
players := strings.Split(newsubmsg, ",") players := strings.Split(newsubmsg, ",")
var online []mcfetch.CacheResult
for _, player := range players { for _, player := range players {
playerName := strings.TrimSpace(player) playerName := strings.TrimSpace(player)
plr, err := app.FetchMCPlayer(playerName) plr, err := app.FetchMCPlayer(playerName)
res_name := plr.Name res_name := plr.Name
res_uuid := plr.UUID res_uuid := plr.UUID
if err != nil { if err != nil {
log.Fatalf("Error fetching UUID: %v", err) fmt.Println(fmt.Sprintf("Error fetching UUID: %v", err))
return continue
} }
fmt.Printf("UUID of player %s: %s\n", res_name, res_uuid) fmt.Printf("UUID of player %s: %s\n", res_name, res_uuid)
res_player := mcfetch.CacheResult{
UUID: plr.UUID,
Name: plr.Name,
}
online = append(online, res_player)
//names, err := GetNameFromUUID(playerUUID) //names, err := GetNameFromUUID(playerUUID)
//if err != nil { //if err != nil {
// log.Fatalf("Error fetching names from UUID: %v", err) // log.Fatalf("Error fetching names from UUID: %v", err)
//} //}
//fmt.Printf("Name history for UUID %s: %v\n", playerUUID, names) //fmt.Printf("Name history for UUID %s: %v\n", playerUUID, names)
} }
app.sendPartyList(online)
} else if strings.HasPrefix(submsg, PartyListSeparatorLinePrefix) { // Party List } else if strings.HasPrefix(submsg, PartyListSeparatorLinePrefix) { // Party List
last, _ := app.LogBuf.GetSecondToLast() last, _ := app.LogBuf.GetSecondToLast()
@ -236,30 +241,25 @@ func (app *DemoApp) tailFile(path string, lineCh chan<- string) {
func (app *DemoApp) sendPartyList(ppl []mcfetch.CacheResult) { func (app *DemoApp) sendPartyList(ppl []mcfetch.CacheResult) {
for _, user := range ppl { for _, user := range ppl {
// Fetch player stats
res, err := app.API.GetPlayerResponse(user.UUID) res, err := app.API.GetPlayerResponse(user.UUID)
if err != nil { if err != nil {
log.Fatalf("Failed to get player data: %v", err) log.Fatalf("Failed to get player data: %v", err)
} }
// Calculate derived stats res.Player.Stats.Bedwars.WLR = calcRatio(res.Player.Stats.Bedwars.Wins, res.Player.Stats.Bedwars.Losses)
res.Player.Stats.Bedwars.WLR = calculateRatio(res.Player.Stats.Bedwars.Wins, res.Player.Stats.Bedwars.Losses) res.Player.Stats.Bedwars.KDR = calcRatio(res.Player.Stats.Bedwars.Kills, res.Player.Stats.Bedwars.Deaths)
res.Player.Stats.Bedwars.KDR = calculateRatio(res.Player.Stats.Bedwars.Kills, res.Player.Stats.Bedwars.Deaths) res.Player.Stats.Bedwars.FKDR = calcRatio(res.Player.Stats.Bedwars.FinalKills, res.Player.Stats.Bedwars.FinalDeaths)
res.Player.Stats.Bedwars.FKDR = calculateRatio(res.Player.Stats.Bedwars.FinalKills, res.Player.Stats.Bedwars.FinalDeaths) res.Player.Stats.Bedwars.BBLR = calcRatio(res.Player.Stats.Bedwars.BedsBroken, res.Player.Stats.Bedwars.BedsLost)
res.Player.Stats.Bedwars.BBLR = calculateRatio(res.Player.Stats.Bedwars.BedsBroken, res.Player.Stats.Bedwars.BedsLost)
// Convert player struct to JSON
playerJSON, err := json.Marshal(res) playerJSON, err := json.Marshal(res)
if err != nil { if err != nil {
log.Fatalf("Failed to marshal player data: %v", err) log.Fatalf("Failed to marshal player data: %v", err)
} }
// Append the player JSON to the stuff list
var playerMap map[string]interface{} var playerMap map[string]interface{}
json.Unmarshal(playerJSON, &playerMap) json.Unmarshal(playerJSON, &playerMap)
app.PartyBuilder = append(app.PartyBuilder, playerMap) app.PartyBuilder = append(app.PartyBuilder, playerMap)
// Send the list of JSON objects to the client
message, err := json.Marshal(app.PartyBuilder) message, err := json.Marshal(app.PartyBuilder)
if err != nil { if err != nil {
log.Fatalf("Failed to marshal stuff: %v", err) log.Fatalf("Failed to marshal stuff: %v", err)
@ -271,6 +271,9 @@ func (app *DemoApp) sendPartyList(ppl []mcfetch.CacheResult) {
fmt.Println("Sent stuff:", app.PartyBuilder) fmt.Println("Sent stuff:", app.PartyBuilder)
println("Sending Done!") println("Sending Done!")
} }
// Clear buffer so it only sends the current party list, not previous party lists
app.PartyBuilder = []map[string]interface{}{}
} }
func (app *DemoApp) Start() { func (app *DemoApp) Start() {
@ -284,7 +287,7 @@ func (app *DemoApp) Start() {
} }
var err error var err error
app.Client, err = netclient.NewClient("0.0.0.0", uuid.New().String()) app.Client, err = netclient.NewClient("chat.itzilly.com", uuid.New().String())
if err != nil { if err != nil {
log.Fatalf("Failed to create client: %v", err) log.Fatalf("Failed to create client: %v", err)
return return
@ -301,13 +304,6 @@ func (app *DemoApp) Start() {
fmt.Printf("[DEV] Joined Branches\n") fmt.Printf("[DEV] Joined Branches\n")
app.Client.ListenForData() app.Client.ListenForData()
// Handle received data in a separate goroutine
go func() {
for data := range app.Client.DataChannel {
fmt.Printf("Received data: %s\n", data)
}
}()
for { for {
select { select {
case data, ok := <-app.Client.DataChannel: case data, ok := <-app.Client.DataChannel:
@ -388,7 +384,6 @@ func (app *DemoApp) HandleData(data string) {
players = append(players, &wrapper.Player) players = append(players, &wrapper.Player)
} }
// Pass the extracted players to DisplayPlayers
app.DisplayPlayers(players) app.DisplayPlayers(players)
} }
@ -399,7 +394,7 @@ func (app *DemoApp) DisplayPlayers(players []*hypixel.Player) {
fmt.Println("|----------------------|------------|------------|") fmt.Println("|----------------------|------------|------------|")
for _, player := range players { for _, player := range players {
fmt.Printf("| %-20s | %-10d | %-10.3f |\n", fmt.Printf("| %-20s | %-10d | %10.3f |\n",
player.DisplayName, player.DisplayName,
player.Achievements.BedwarsLevel, player.Achievements.BedwarsLevel,
player.Stats.Bedwars.FKDR) player.Stats.Bedwars.FKDR)

View File

@ -5,9 +5,11 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"log"
"math/rand" "math/rand"
"net" "net"
"sync" "sync"
"time"
) )
const PORT = ":5518" const PORT = ":5518"
@ -159,7 +161,8 @@ func handleClient(conn net.Conn) {
var packetId PacketID var packetId PacketID
packetId, data, err := readPacket(conn) packetId, data, err := readPacket(conn)
if err != nil { if err != nil {
fmt.Println("Error reading packet:", err) fmt.Println("Error reading packet (handleclient) :", err)
handleLeaveRoom(conn)
return return
} }
@ -354,13 +357,12 @@ func handleLeaveRoom(conn net.Conn) {
break break
} }
} }
if leavingClient == nil { if leavingClient == nil {
fmt.Println("Client not found") fmt.Println("Client not found")
return return
} }
room := findRoom(leavingClient.RoomCode) room := rooms[leavingClient.RoomCode]
if room == nil { if room == nil {
fmt.Println("Room not found") fmt.Println("Room not found")
return return
@ -368,30 +370,31 @@ func handleLeaveRoom(conn net.Conn) {
for i, client := range room.Clients { for i, client := range room.Clients {
if client == leavingClient { if client == leavingClient {
// Remove the client from the list
room.Clients = append(room.Clients[:i], room.Clients[i+1:]...) room.Clients = append(room.Clients[:i], room.Clients[i+1:]...)
break break
} }
} }
// If the room is now empty or the leaving client was the creator, delete the room // Delete the room if its empty
if len(room.Clients) == 0 || room.Clients[0] == leavingClient { if len(room.Clients) == 0 {
for _, client := range room.Clients {
client.Conn.Close()
}
delete(rooms, room.Code) delete(rooms, room.Code)
fmt.Println("Room", room.Code, "deleted") fmt.Println("Room", room.Code, "deleted")
} else {
// // Notify remaining clients that a user has left (optional)
// for _, remainingClient := range room.Clients {
// writePacket(remainingClient.Conn, byte(LEAVE_ROOM), []byte(fmt.Sprintf("User %s has left the room", leavingClient.ClientID)))
// }
} }
delete(clients, leavingClient.ClientID) delete(clients, leavingClient.ClientID)
done := make(chan struct{})
go func() {
leavingClient.Conn.Close() leavingClient.Conn.Close()
close(done)
}()
select {
case <-done:
case <-time.After(5 * time.Second):
log.Fatalln("Timeout while closing leaving client's connection")
}
fmt.Println("Client", leavingClient.ClientID, "left the room and connection closed") fmt.Println("Client", leavingClient.ClientID, "left the room and connection closed")
} }