Repository navigation
Expand file tree
/
Copy pathdSwitchTo.go
More file actions
111 lines (100 loc) · 2.88 KB
/
Copy pathdSwitchTo.go
File metadata and controls
111 lines (100 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"fmt"
"slices"
"strings"
"sync"
"github.com/bwmarrin/discordgo"
"github.com/charmbracelet/log"
)
func dSwitchTo(s *discordgo.Session, i *discordgo.InteractionCreate, cfg config) {
id := strings.Split(i.MessageComponentData().CustomID, "/")[1]
server := slices.IndexFunc(cfg.Servers, func(v configServer) bool {
return v.ServerID == id
})
if server == -1 {
log.Warn("Failed to find server", "server", id)
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData{
Flags: discordgo.MessageFlagsEphemeral,
Content: loc("generic.failed"),
},
})
return
}
srv := cfg.Servers[server]
currentPlayerCount := ccGetPlayerCount(srv)
if currentPlayerCount == 0 {
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseUpdateMessage,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{
{
Description: loc("pack.stopping"),
Color: hexToInt(loc("color.error")),
},
},
},
})
killServer(i.ChannelID, srv)
_, err := s.ChannelMessageSendComplex(i.ChannelID, &discordgo.MessageSend{
Flags: discordgo.MessageFlagsEphemeral,
Content: fmt.Sprintf(loc("pack.shutDown"), srv.DisplayName),
})
if err != nil {
log.Warn("Failed to send shutdown message", "server", srv.DisplayName, "err", err)
}
return
} else if currentPlayerCount > 0 {
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseUpdateMessage,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{
{
Description: loc("pack.switch.occupied"),
Color: hexToInt(loc("color.error")),
},
},
},
})
return
}
runningEmpty, resourceSlotsUnused := ccGetRunningEmptyServers(cfg.Servers)
toKill := serverPurge(runningEmpty, srv.ResourceSlots, cfg.ResourceSlots-resourceSlotsUnused)
if toKill == nil {
s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseUpdateMessage,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{
{
Description: loc("pack.switchingFailed"),
Color: hexToInt(loc("color.error")),
},
},
},
})
return
}
errError(s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{
Type: discordgo.InteractionResponseUpdateMessage,
Data: &discordgo.InteractionResponseData{
Embeds: []*discordgo.MessageEmbed{
{
Description: loc("pack.switching"),
Color: hexToInt(loc("color.success")),
},
},
},
}))
var wg sync.WaitGroup
for _, v := range toKill {
wg.Add(1)
go func(v configServer) {
killServer(i.ChannelID, v)
wg.Done()
}(v)
}
wg.Wait()
bootServer(i.ChannelID, srv)
}