Skip to content

Commit 7475a51

Browse files
authored
Merge pull request #48 from Quaver/clan-chat-channels
Implement clan chat channels
2 parents e8298ed + 1ad811e commit 7475a51

File tree

7 files changed

+115
-5
lines changed

7 files changed

+115
-5
lines changed

chat/channel.go

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
ChannelNormal ChannelType = iota
3030
ChannelTypeMultiplayer
3131
ChannelTypeSpectator
32+
ChannelTypeClan
3233
)
3334

3435
// NewChannel Creates a new chat channel instance

chat/chat.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ func Initialize() {
3434
addChannel(NewChannel(ChannelNormal, channel.Name, channel.Description, channel.AdminOnly, channel.AutoJoin, channel.LimitedChat, channel.DiscordWebhook))
3535
}
3636

37+
clans, err := db.GetAllClans()
38+
39+
if err != nil {
40+
panic(err)
41+
}
42+
43+
for _, clan := range clans {
44+
AddClanChannel(clan.Id)
45+
}
46+
3747
_ = sessions.AddUser(Bot)
3848
addBotChatHandlers()
3949
addSpectatorHandlers()
@@ -47,7 +57,10 @@ func GetAvailableChannels(userGroups common.UserGroups) []*Channel {
4757
var availableChannels []*Channel
4858

4959
for _, channel := range channels {
50-
if (channel.Type != ChannelTypeMultiplayer && channel.Type != ChannelTypeSpectator && !channel.AdminOnly) || (channel.AdminOnly && isChatModerator(userGroups)) {
60+
if (channel.Type != ChannelTypeClan &&
61+
channel.Type != ChannelTypeMultiplayer &&
62+
channel.Type != ChannelTypeSpectator && !channel.AdminOnly) ||
63+
(channel.AdminOnly && isChatModerator(userGroups)) {
5164
availableChannels = append(availableChannels, channel)
5265
}
5366
}
@@ -243,6 +256,18 @@ func addChannel(channel *Channel) {
243256
log.Printf("Initialized chat channel: %v\n", channel.Name)
244257
}
245258

259+
// AddClanChannel Adds a new clan channel
260+
func AddClanChannel(clanId int) *Channel {
261+
name := fmt.Sprintf("#clan_%v", clanId)
262+
263+
channel := NewChannel(ChannelTypeClan, name, "Communicate with your fellow clan members",
264+
false, false, false, "")
265+
266+
addChannel(channel)
267+
268+
return channel
269+
}
270+
246271
// Removes a channel from channels
247272
func removeChannel(channel *Channel) {
248273
chatMutex.Lock()

db/clans.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package db
2+
3+
import "database/sql"
4+
5+
type Clan struct {
6+
Id int `db:"id"`
7+
OwnerId int `db:"owner_id"`
8+
Name string `db:"name"`
9+
Tag string `db:"tag"`
10+
Customizable bool `db:"customizable"`
11+
}
12+
13+
// GetAllClans Retrieves all of the clans in the db
14+
func GetAllClans() ([]*Clan, error) {
15+
result := make([]*Clan, 0)
16+
17+
err := SQL.Select(&result, "SELECT id, owner_id, name, tag, customizable FROM clans")
18+
19+
if err != nil && err != sql.ErrNoRows {
20+
return nil, err
21+
}
22+
23+
return result, nil
24+
}

db/redis.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var (
1616
RedisChannelTwitchConnection = "quaver:twitch_connection"
1717
RedisChannelMultiplayerMapShares = "quaver:multiplayer_map_shares"
1818
RedisChannelFirstPlaceScores = "quaver:first_place_scores"
19+
RedisChannelRankedClanMap = "quaver:ranked_clan_map"
1920
)
2021

2122
// InitializeRedis Initializes a Redis client
@@ -39,7 +40,7 @@ func InitializeRedis() {
3940
log.Fatalln(result.Err())
4041
}
4142

42-
sub := Redis.Subscribe(RedisCtx, RedisChannelSongRequests, RedisChannelTwitchConnection, RedisChannelMultiplayerMapShares, RedisChannelFirstPlaceScores)
43+
sub := Redis.Subscribe(RedisCtx, RedisChannelSongRequests, RedisChannelTwitchConnection, RedisChannelMultiplayerMapShares, RedisChannelFirstPlaceScores, RedisChannelRankedClanMap)
4344

4445
go func() {
4546
for {

db/users.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type User struct {
2121
Country string `db:"country"`
2222
AvatarUrl sql.NullString `db:"avatar_url"`
2323
TwitchUsername sql.NullString `db:"twitch_username"`
24+
ClanId sql.NullInt32 `db:"clan_id"`
2425
}
2526

2627
// GetProfileUrl Returns the full profile url for the user
@@ -30,7 +31,7 @@ func (u *User) GetProfileUrl() string {
3031

3132
// GetUserById Retrieves a user from the database by their id
3233
func GetUserById(id int) (*User, error) {
33-
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username FROM users WHERE id = ? LIMIT 1"
34+
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username, clan_id FROM users WHERE id = ? LIMIT 1"
3435

3536
var user User
3637
err := SQL.Get(&user, query, id)
@@ -44,7 +45,7 @@ func GetUserById(id int) (*User, error) {
4445

4546
// GetUserBySteamId Retrieves a user from the database by their Steam id
4647
func GetUserBySteamId(steamId string) (*User, error) {
47-
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username FROM users WHERE steam_id = ? LIMIT 1"
48+
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username, clan_id FROM users WHERE steam_id = ? LIMIT 1"
4849

4950
var user User
5051
err := SQL.Get(&user, query, steamId)
@@ -58,7 +59,7 @@ func GetUserBySteamId(steamId string) (*User, error) {
5859

5960
// GetUserByUsername Rerieves a user from the database by their username
6061
func GetUserByUsername(username string) (*User, error) {
61-
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username FROM users WHERE username = ? LIMIT 1"
62+
query := "SELECT id, steam_id, username, allowed, privileges, usergroups, mute_endtime, country, avatar_url, twitch_username, clan_id FROM users WHERE username = ? LIMIT 1"
6263

6364
var user User
6465
err := SQL.Get(&user, query, username)

handlers/RedisSubHandler.go

+43
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func AddRedisHandlers() {
1717
db.AddRedisSubscriberHandler(db.RedisChannelTwitchConnection, HandleTwitchConnection)
1818
db.AddRedisSubscriberHandler(db.RedisChannelMultiplayerMapShares, HandleMultiplayerMapShares)
1919
db.AddRedisSubscriberHandler(db.RedisChannelFirstPlaceScores, HandleFirstPlaceScores)
20+
db.AddRedisSubscriberHandler(db.RedisChannelRankedClanMap, HandleRankedClanMap)
2021
}
2122

2223
func HandleTwitchSongRequest(msg *redis.Message) {
@@ -153,3 +154,45 @@ func HandleFirstPlaceScores(msg *redis.Message) {
153154
chat.SendMessage(chat.Bot, "#first-places", fmt.Sprintf("%v has just achieved first place on %v - %v [%v]",
154155
parsed.User.Username, parsed.Map.Artist, parsed.Map.Title, parsed.Map.DifficultyName))
155156
}
157+
158+
func HandleRankedClanMap(msg *redis.Message) {
159+
type payload struct {
160+
Map struct {
161+
Id int `json:"id"`
162+
Artist string `json:"artist"`
163+
Title string `json:"title"`
164+
DifficultyName string `json:"difficulty_name"`
165+
CreatorName string `json:"creator_name"`
166+
Mode string `json:"mode"`
167+
} `json:"map"`
168+
}
169+
170+
var parsed payload
171+
172+
err := json.Unmarshal([]byte(msg.Payload), &parsed)
173+
174+
if err != nil {
175+
log.Printf("Failed to parse ranked clan map - %v - %v\n", msg.Payload, err)
176+
return
177+
}
178+
179+
clans, err := db.GetAllClans()
180+
181+
if err != nil {
182+
panic(err)
183+
}
184+
185+
for _, clan := range clans {
186+
channel := chat.GetChannelByName(fmt.Sprintf("#clan_%v", clan.Id))
187+
188+
if channel == nil {
189+
continue
190+
}
191+
192+
msg := fmt.Sprintf("New %v Clan Ranked Map: %v - %v [%v] by %v (#%v).",
193+
parsed.Map.Mode, parsed.Map.Artist, parsed.Map.Title, parsed.Map.DifficultyName, parsed.Map.CreatorName,
194+
parsed.Map.Id)
195+
196+
chat.SendMessage(chat.Bot, channel.Name, msg)
197+
}
198+
}

handlers/login.go

+15
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,21 @@ func joinChatChannels(user *sessions.User) {
422422
channel.AddUser(user)
423423
}
424424
}
425+
426+
// Add user to clan channel (creates the new clan channel if necessary)
427+
if user.Info.ClanId.Valid {
428+
name := fmt.Sprintf("#clan_%v", user.Info.ClanId.Int32)
429+
430+
channel := chat.GetChannelByName(name)
431+
432+
if channel != nil {
433+
channel.AddUser(user)
434+
return
435+
}
436+
437+
channel = chat.AddClanChannel(int(user.Info.ClanId.Int32))
438+
channel.AddUser(user)
439+
}
425440
}
426441

427442
// Logs a generic login failure

0 commit comments

Comments
 (0)