diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 5f5b95b..0de75f5 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -256,6 +256,8 @@ %1$s récupère %2$d point(s) de vie %1$s utilise %2$d point(s) de pouvoir %1$s récupère %2$d point(s) de pouvoir + dépense + empoche Paramètres de l'application Paramètres par défault diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt index e8c7ec4..d62958d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClient.kt @@ -7,6 +7,7 @@ import com.pixelized.shared.lwa.model.inventory.InventoryJson import com.pixelized.shared.lwa.model.item.ItemJson import com.pixelized.shared.lwa.model.tag.TagJson import com.pixelized.shared.lwa.protocol.rest.APIResponse +import com.pixelized.shared.lwa.protocol.rest.ApiPurseJson import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson interface LwaClient { @@ -116,6 +117,10 @@ interface LwaClient { create: Boolean, ): APIResponse + suspend fun putInventoryPurse( + purse: ApiPurseJson, + ): APIResponse + suspend fun deleteInventory( characterSheetId: String, ): APIResponse diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt index 381cfd8..2ab94c9 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/network/LwaClientImpl.kt @@ -8,6 +8,7 @@ import com.pixelized.shared.lwa.model.inventory.InventoryJson import com.pixelized.shared.lwa.model.item.ItemJson import com.pixelized.shared.lwa.model.tag.TagJson import com.pixelized.shared.lwa.protocol.rest.APIResponse +import com.pixelized.shared.lwa.protocol.rest.ApiPurseJson import com.pixelized.shared.lwa.protocol.rest.CharacterPreviewJson import io.ktor.client.HttpClient import io.ktor.client.call.body @@ -199,6 +200,16 @@ class LwaClientImpl( } .body>() + @Throws + override suspend fun putInventoryPurse( + purse: ApiPurseJson, + ): APIResponse = client + .put("$root/inventory/update/purse") { + contentType(ContentType.Application.Json) + setBody(purse) + } + .body>() + @Throws override suspend fun deleteInventory(characterSheetId: String): APIResponse = client .delete("$root/inventory/delete?characterSheetId=$characterSheetId") diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt index 8037caa..fab2a86 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryRepository.kt @@ -3,7 +3,6 @@ package com.pixelized.desktop.lwa.repository.inventory import com.pixelized.shared.lwa.model.inventory.Inventory import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map class InventoryRepository( @@ -50,6 +49,17 @@ class InventoryRepository( ) } + @Throws + suspend fun updateInventoryPurse( + characterSheetId: String, + purse: Inventory.Purse, + ) { + inventoryStore.putInventoryPurse( + characterSheetId = characterSheetId, + purse = purse, + ) + } + @Throws suspend fun createInventoryItem( characterSheetId: String, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt index 2d5dc2f..6984987 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/inventory/InventoryStore.kt @@ -73,6 +73,22 @@ class InventoryStore( } } + @Throws + suspend fun putInventoryPurse( + characterSheetId: String, + purse: Inventory.Purse, + ) { + val request = client.putInventoryPurse( + purse = factory.convertToApiPurse( + characterSheetId = characterSheetId, + purse = purse, + ), + ) + if (request.success.not()) { + LwaClient.error(error = request) + } + } + @Throws suspend fun deleteInventory( characterSheetId: String, @@ -163,6 +179,20 @@ class InventoryStore( private suspend fun handleMessage(message: SocketMessage) { when (message) { is ApiSynchronisation.InventoryApiSynchronisation -> when (message) { + is ApiSynchronisation.PurseUpdate -> _inventories.update { + it.toMutableMap().also { inventories -> + inventories[message.characterSheetId]?.let { inventory -> + inventories[message.characterSheetId] = inventory.copy( + purse = Inventory.Purse( + gold = inventory.purse.gold + message.gold, + silver = inventory.purse.silver + message.silver, + copper = inventory.purse.copper + message.copper, + ) + ) + } + } + } + is ApiSynchronisation.InventoryUpdate -> updateInventoryFlow( characterSheetId = message.characterSheetId, ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/purse/PurseDialogViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/purse/PurseDialogViewModel.kt index 2bfb767..f6cf405 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/purse/PurseDialogViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/purse/PurseDialogViewModel.kt @@ -55,29 +55,26 @@ class PurseDialogViewModel( if (dialog.enableConfirm.value.not()) { return false } - // Get the player inventory - val inventory = inventoryRepository.inventory(characterSheetId = dialog.characterSheetId) // compute the new purse val sign = if (dialog.add.value) 1 else -1 val goldValue = dialog.gold.valueFlow.value.toIntOrNull() ?: 0 val silverValue = dialog.silver.valueFlow.value.toIntOrNull() ?: 0 val copperValue = dialog.copper.valueFlow.value.toIntOrNull() ?: 0 - val purse = Inventory.Purse( - gold = inventory.purse.gold + goldValue * sign, - silver = inventory.purse.silver + silverValue * sign, - copper = inventory.purse.copper + copperValue * sign, - ) // guard case: check if the purse change, not an error case, but avoid useless API call. - if (inventory.purse == purse) { + if (goldValue == 0 && silverValue == 0 && copperValue == 0) { return true } + // build a purse delta + val purse = Inventory.Purse( + gold = goldValue * sign, + silver = silverValue * sign, + copper = copperValue * sign, + ) // API call. return try { - inventoryRepository.updateInventory( - inventory = inventory.copy( - purse = purse - ), - create = false, + inventoryRepository.updateInventoryPurse( + characterSheetId = dialog.characterSheetId, + purse = purse, ) true } catch (exception: Exception) { diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt index 7be539b..5fcd12e 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt @@ -39,6 +39,8 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.Characteristic import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.CharacteristicTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.DiminishedTextMessage import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.DiminishedTextMessageUio +import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.PurseTextMessage +import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.PurseTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.RollTextMessage import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.RollTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.TextMessage @@ -123,6 +125,7 @@ fun CampaignChat( ) { when (it) { is RollTextMessageUio -> RollTextMessage(message = it) + is PurseTextMessageUio -> PurseTextMessage(message = it) is DiminishedTextMessageUio -> DiminishedTextMessage(message = it) is CharacteristicTextMessageUio -> CharacteristicTextMessage(message = it) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt index caf7665..0148b95 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/TextMessageFactory.kt @@ -4,6 +4,7 @@ import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetReposit import com.pixelized.desktop.lwa.repository.settings.model.Settings import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.CharacteristicTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.DiminishedTextMessageUio +import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.PurseTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.RollTextMessageUio import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.TextMessage import com.pixelized.shared.lwa.model.campaign.Campaign @@ -19,6 +20,8 @@ import lwacharactersheet.composeapp.generated.resources.chat__characteristic_cha import lwacharactersheet.composeapp.generated.resources.chat__characteristic_change__hp_up import lwacharactersheet.composeapp.generated.resources.chat__characteristic_change__pp_down import lwacharactersheet.composeapp.generated.resources.chat__characteristic_change__pp_up +import lwacharactersheet.composeapp.generated.resources.chat__purse_change__earn +import lwacharactersheet.composeapp.generated.resources.chat__purse_change__spend import java.text.SimpleDateFormat import kotlin.math.abs @@ -143,7 +146,33 @@ class TextMessageFactory( is GameAdminEvent -> null - is ApiSynchronisation -> null + is ApiSynchronisation -> when (message) { + + is ApiSynchronisation.PurseUpdate -> { + // only display the message if the character is in the party. + val isInParty = campaign.characters.contains(message.characterSheetId) + if (isInParty.not()) return null + // get the character sheet + val sheet = characterSheetRepository + .characterDetail(characterSheetId = message.characterSheetId) + ?: return null + + PurseTextMessageUio( + id = "${message.timestamp}-${message.characterSheetId}-Purse", + timestamp = formatTime.format(message.timestamp), + character = sheet.name, + action = when (message.add) { + true -> Res.string.chat__purse_change__earn + else -> Res.string.chat__purse_change__spend + }, + gold = message.gold.takeIf { it != 0 }?.let { abs(it) }, + silver = message.silver.takeIf { it != 0 }?.let { abs(it) }, + copper = message.copper.takeIf { it != 0 }?.let { abs(it) }, + ) + } + + else -> null + } } } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/messages/PurseTextMessage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/messages/PurseTextMessage.kt new file mode 100644 index 0000000..6a05095 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/messages/PurseTextMessage.kt @@ -0,0 +1,124 @@ +package com.pixelized.desktop.lwa.ui.screen.campaign.text.messages + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.ui.theme.lwa +import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.ic_copper_32px +import lwacharactersheet.composeapp.generated.resources.ic_gold_32px +import lwacharactersheet.composeapp.generated.resources.ic_silver_32px +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource + +@Stable +data class PurseTextMessageUio( + override val id: String, + override val timestamp: String, + val character: String, + val action: StringResource, + val gold: Int?, + val silver: Int?, + val copper: Int?, +) : TextMessage + +@Composable +fun PurseTextMessage( + modifier: Modifier = Modifier, + message: PurseTextMessageUio, +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(space = 3.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.timestamp, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = message.timestamp, + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.timestamp, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = ">", + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.text, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = message.character, + ) + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.text, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = stringResource(message.action), + ) + message.gold?.let { + Row { + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.text, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = "$it", + ) + Image( + painter = painterResource(Res.drawable.ic_gold_32px), + modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp), + contentDescription = null, + ) + } + } + message.silver?.let { + Row { + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.text, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = "$it", + ) + Image( + painter = painterResource(Res.drawable.ic_silver_32px), + modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp), + contentDescription = null, + ) + } + } + + message.copper?.let { + Row { + Text( + modifier = Modifier.alignByBaseline(), + style = MaterialTheme.lwa.typography.chat.text, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + text = "$it", + ) + Image( + painter = painterResource(Res.drawable.ic_copper_32px), + modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp), + contentDescription = null, + ) + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionPage.kt index fc30ffd..e7a5dcb 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/action/GMActionPage.kt @@ -88,7 +88,7 @@ fun GMActionContent( GMAction( modifier = Modifier.fillMaxWidth(), icon = Res.drawable.ic_sync_24dp, - label = "Syncrhonization du serveur", + label = "Synchronization du serveur", onAction = onServerSync, ) GMAction( diff --git a/server/src/main/kotlin/com/pixelized/server/lwa/model/inventory/InventoryService.kt b/server/src/main/kotlin/com/pixelized/server/lwa/model/inventory/InventoryService.kt index 7ebb404..fbe7d57 100644 --- a/server/src/main/kotlin/com/pixelized/server/lwa/model/inventory/InventoryService.kt +++ b/server/src/main/kotlin/com/pixelized/server/lwa/model/inventory/InventoryService.kt @@ -5,6 +5,7 @@ import com.pixelized.server.lwa.server.exception.BusinessException import com.pixelized.shared.lwa.model.inventory.Inventory import com.pixelized.shared.lwa.model.inventory.InventoryJson import com.pixelized.shared.lwa.model.inventory.factory.InventoryJsonFactory +import com.pixelized.shared.lwa.protocol.rest.ApiPurseJson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -38,6 +39,25 @@ class InventoryService( ?: factory.convertToJson(Inventory.empty(characterSheetId = characterSheetId)) } + @Throws + fun updatePurse( + purse: ApiPurseJson, + ) { + val inventory = inventory( + characterSheetId = purse.characterSheetId + ) + inventoryStore.save( + inventory = inventory.copy( + purse = inventory.purse.copy( + gold = inventory.purse.gold + purse.gold, + silver = inventory.purse.silver + purse.silver, + copper = inventory.purse.copper + purse.copper, + ), + ), + create = false, + ) + } + @Throws fun save( inventoryJson: InventoryJson, diff --git a/server/src/main/kotlin/com/pixelized/server/lwa/server/Server.kt b/server/src/main/kotlin/com/pixelized/server/lwa/server/Server.kt index 7d0facb..9441308 100644 --- a/server/src/main/kotlin/com/pixelized/server/lwa/server/Server.kt +++ b/server/src/main/kotlin/com/pixelized/server/lwa/server/Server.kt @@ -28,6 +28,7 @@ import com.pixelized.server.lwa.server.rest.inventory.deleteInventory import com.pixelized.server.lwa.server.rest.inventory.deleteInventoryItem import com.pixelized.server.lwa.server.rest.inventory.getInventory import com.pixelized.server.lwa.server.rest.inventory.putInventory +import com.pixelized.server.lwa.server.rest.inventory.putPurse import com.pixelized.server.lwa.server.rest.item.deleteItem import com.pixelized.server.lwa.server.rest.item.getItem import com.pixelized.server.lwa.server.rest.item.getItems @@ -272,6 +273,10 @@ class LocalServer { path = "/update", body = engine.putInventory() ) + put( + path = "/update/purse", + body = engine.putPurse(), + ) delete( path = "/delete", body = engine.deleteInventory() diff --git a/server/src/main/kotlin/com/pixelized/server/lwa/server/rest/inventory/PUT_Purse.kt b/server/src/main/kotlin/com/pixelized/server/lwa/server/rest/inventory/PUT_Purse.kt new file mode 100644 index 0000000..9577eb0 --- /dev/null +++ b/server/src/main/kotlin/com/pixelized/server/lwa/server/rest/inventory/PUT_Purse.kt @@ -0,0 +1,41 @@ +package com.pixelized.server.lwa.server.rest.inventory + +import com.pixelized.server.lwa.server.Engine +import com.pixelized.server.lwa.utils.extentions.exception +import com.pixelized.shared.lwa.protocol.rest.APIResponse +import com.pixelized.shared.lwa.protocol.rest.ApiPurseJson +import com.pixelized.shared.lwa.protocol.websocket.ApiSynchronisation +import io.ktor.server.request.receive +import io.ktor.server.response.respond +import io.ktor.server.routing.RoutingContext + +fun Engine.putPurse(): suspend RoutingContext.() -> Unit { + return { + try { + // get the query parameter + val form = call.receive() + // get the character inventory + inventoryService.updatePurse( + purse = form, + ) + // send it back to the user. + call.respond( + message = APIResponse.success() + ) + webSocket.emit( + value = ApiSynchronisation.PurseUpdate( + timestamp = System.currentTimeMillis(), + characterSheetId = form.characterSheetId, + add = (form.gold * 10000 + form.silver * 100 + form.copper) >= 0, + gold = form.gold, + silver = form.silver, + copper = form.copper, + ), + ) + } catch (exception: Exception) { + call.exception( + exception = exception + ) + } + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactory.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactory.kt index dcb921c..a222963 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactory.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactory.kt @@ -3,6 +3,7 @@ package com.pixelized.shared.lwa.model.inventory.factory import com.pixelized.shared.lwa.model.inventory.Inventory import com.pixelized.shared.lwa.model.inventory.InventoryJson import com.pixelized.shared.lwa.model.inventory.InventoryJsonV1 +import com.pixelized.shared.lwa.protocol.rest.ApiPurseJson class InventoryJsonFactory( private val v1: InventoryJsonFactoryV1, @@ -16,4 +17,16 @@ class InventoryJsonFactory( fun convertToJson(inventory: Inventory): InventoryJson { return v1.convertToJson(inventory = inventory) } + + fun convertToApiPurse( + characterSheetId: String, + purse: Inventory.Purse, + ): ApiPurseJson { + return ApiPurseJson( + characterSheetId = characterSheetId, + gold = purse.gold, + silver = purse.silver, + copper = purse.copper, + ) + } } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/rest/PurseJson.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/rest/PurseJson.kt new file mode 100644 index 0000000..192d1de --- /dev/null +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/rest/PurseJson.kt @@ -0,0 +1,11 @@ +package com.pixelized.shared.lwa.protocol.rest + +import kotlinx.serialization.Serializable + +@Serializable +data class ApiPurseJson( + val characterSheetId: String, + val gold: Int, + val silver: Int, + val copper: Int, +) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/websocket/ApiSynchronisation.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/websocket/ApiSynchronisation.kt index 314468a..ebed79e 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/websocket/ApiSynchronisation.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/protocol/websocket/ApiSynchronisation.kt @@ -53,6 +53,16 @@ sealed interface ApiSynchronisation : SocketMessage { @Serializable sealed interface InventoryApiSynchronisation : ApiSynchronisation, CharacterSheetIdMessage + @Serializable + data class PurseUpdate( + override val timestamp: Long, + override val characterSheetId: String, + val add : Boolean, + val gold: Int, + val silver: Int, + val copper: Int, + ) : InventoryApiSynchronisation + @Serializable data class InventoryUpdate( override val timestamp: Long,