This repository was archived by the owner on Nov 13, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPartHandler.kt
More file actions
126 lines (113 loc) · 5 KB
/
PartHandler.kt
File metadata and controls
126 lines (113 loc) · 5 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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.github.jambeez.server.worker
import com.fasterxml.jackson.annotation.JsonProperty
import com.github.jambeez.server.domain.DomainController
import com.github.jambeez.server.domain.Lobby
import com.github.jambeez.server.domain.Part
import com.github.jambeez.server.domain.Track
import com.github.jambeez.server.domain.intent.IntentWrapper
import org.springframework.web.socket.TextMessage
class PartHandler(domainController: DomainController, lobbyInformer: LobbyInformer) :
Handler(domainController, lobbyInformer) {
override fun handle(
connectionData: WebsocketConnectionData,
message: TextMessage,
intent: String
) {
when (intent) {
PART_CHANGE_BPM -> changeBPM(connectionData, message)
PART_CHANGE_BARS -> changeBars(connectionData, message)
PART_CHANGE_SIG_LOWER -> changeSigLower(connectionData, message)
PART_CHANGE_SIG_UPPER -> changeSigUpper(connectionData, message)
PART_REMOVE_TRACK -> removeTrack(connectionData, message)
PART_ADD_TRACK -> addTrack(connectionData, message, intent)
else -> unknown(PartHandler::class.java, connectionData, intent)
}
}
private fun addTrack(
connectionData: WebsocketConnectionData,
message: TextMessage,
intent: String
) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.trackToAdd != null && it.validate() },
changeApplier = { p, c -> setTrack(p, c) },
subjectFinder = { l, c -> findPart(l, c) },
messageForBroadcast = { _, c ->
IntentWrapper(intent, NewTrackResponse(c.partId, c.trackToAdd!!)).payload()
})
}
private fun setTrack(p: Part, c: PartChange) {
val track = c.trackToAdd!!
track.colorPerBeat.clear()
track.beats.forEach { _ -> track.colorPerBeat.add(listOf()) }
p.tracks.add(track)
}
private fun removeTrack(connectionData: WebsocketConnectionData, message: TextMessage) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.trackToRemove != null && it.validate() },
changeApplier = { p, c -> p.tracks.removeIf { it.id == c.trackToRemove!! } },
subjectFinder = { l, c -> findPart(l, c) })
}
private fun changeBPM(connectionData: WebsocketConnectionData, message: TextMessage) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.bpm != null && it.validate() },
changeApplier = { p, c -> p.bpm = c.bpm!! },
subjectFinder = { l, c -> findPart(l, c) })
}
private fun changeBars(connectionData: WebsocketConnectionData, message: TextMessage) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.bars != null && it.validate() },
changeApplier = { p, c -> p.bars = c.bars!! },
subjectFinder = { l, c -> findPart(l, c) })
}
private fun changeSigUpper(connectionData: WebsocketConnectionData, message: TextMessage) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.sigUpper != null && it.validate() },
changeApplier = { p, c -> p.sigUpper = c.sigUpper!! },
subjectFinder = { l, c -> findPart(l, c) })
}
private fun changeSigLower(connectionData: WebsocketConnectionData, message: TextMessage) {
changeAttribute<Part, PartChange>(
connectionData,
message,
changeRequestValidator = { it.sigLower != null && it.validate() },
changeApplier = { p, c -> p.sigLower = c.sigLower!! },
subjectFinder = { l, c -> findPart(l, c) })
}
private fun findPart(lobby: Lobby, partChange: PartChange): Part {
return lobby.parts.find { p -> p.id == partChange.partId }
?: throw WorkerException("Invalid PartId")
}
private data class PartChange(
@JsonProperty("part_id") val partId: String,
val bpm: Int? = null,
val bars: Int? = null,
@JsonProperty("sig_lower") val sigLower: Int? = null,
@JsonProperty("sig_upper") val sigUpper: Int? = null,
@JsonProperty("track_to_remove") val trackToRemove: String? = null,
@JsonProperty("track_to_add") val trackToAdd: Track? = null
) {
fun validate(): Boolean {
if (bpm != null) return bpm > 0
if (bars != null) return bars > 0
if (sigLower != null) return sigLower > 0
if (sigUpper != null) return sigUpper > 0
if (trackToAdd != null) return trackToAdd.validate()
return true
}
}
private data class NewTrackResponse(
@JsonProperty("part_id") val partId: String,
@JsonProperty("track_to_add") val trackToAdd: Track
)
}