Skip to content

Commit

Permalink
fix(server): add ability to set held item on admin interface
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielMcAssey committed Jan 14, 2025
1 parent 30def8a commit ea65cbc
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 13 deletions.
123 changes: 116 additions & 7 deletions GLOKON.Baiters.Client/src/pages/Users.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import Dialog from 'primevue/dialog';
import InputText from 'primevue/inputtext';
import Textarea from 'primevue/textarea';
import InputGroup from 'primevue/inputgroup';
import Select from 'primevue/select';
import InputNumber from 'primevue/inputnumber';
import type { AxiosInstance } from 'axios';
import PlayerData from '@/components/PlayerData.vue';
import Tag from 'primevue/tag';
Expand All @@ -20,6 +22,14 @@ const isLoading = ref(false);
const $http = inject<AxiosInstance>('axios') as AxiosInstance;
/* eslint-disable @typescript-eslint/no-explicit-any */
const results = ref<any[]>([]);
const itemQualities = [
{ quality: 0, name: 'Normal', },
{ quality: 1, name: 'Shining', },
{ quality: 2, name: 'Glistening', },
{ quality: 3, name: 'Opulent', },
{ quality: 4, name: 'Radiant', },
{ quality: 5, name: 'Alpha', },
];
function fetchData(): void {
isLoading.value = true;
Expand Down Expand Up @@ -121,6 +131,45 @@ function kickPlayer(event: Event, steamId: string) {
});
}
const isSetHeldItemOpen = ref(false);
const setHeldItemOn = ref<number | undefined>(undefined);
const heldItemId = ref<string>('');
const heldItemSize = ref<number>(1);
const heldItemQuality = ref<number>(0);
function openSetHeldItem(steamId?: number): void {
setHeldItemOn.value = steamId;
isSetHeldItemOpen.value = true;
}
function closeHeldItem(): void {
isSetHeldItemOpen.value = false;
setHeldItemOn.value = undefined;
heldItemId.value = '';
heldItemSize.value = 1;
heldItemQuality.value = 0;
}
function setHeldItem(): void {
const steamId = sendLetterTo.value ?? '';
$http.post(`/api/users/held-item/${steamId}`, {
id: heldItemId.value,
size: heldItemSize.value,
quality: heldItemQuality.value,
})
.then(() => closeHeldItem())
.catch((err: Error) => {
console.error(err, 'Couldn\'t set held item on player(s)');
toast.add({
severity: 'error',
summary: 'Problem Setting Held Item',
detail: 'There was a problem setting the held item on the player(s)',
life: 10000,
});
})
.finally(() => fetchData());
}
const isLetterComposeOpen = ref(false);
const sendLetterTo = ref<number | undefined>(undefined);
const letterHeader = ref<string>('');
Expand All @@ -135,6 +184,7 @@ function composeLetter(steamId?: number): void {
function closeComposeLetter(): void {
isLetterComposeOpen.value = false;
sendLetterTo.value = undefined;
letterHeader.value = '';
letterBody.value = '';
letterClosing.value = '';
Expand Down Expand Up @@ -188,6 +238,11 @@ onMounted(() => {
label="Send Letter to Everyone"
severity="info"
@click="composeLetter()" />

<Button icon="fas fa-icons"
label="Set Held Item for Everyone"
severity="info"
@click="openSetHeldItem()" />
</div>
<DataTable :value="results" data-key="id" paginator :row-hover="true" :loading="isLoading"
:rows="50" :rowsPerPageOptions="[25, 50, 100]" stripedRows responsiveLayout="scroll">
Expand Down Expand Up @@ -223,6 +278,7 @@ onMounted(() => {
<template #body="slotProps">
<ButtonGroup>
<Button icon="fas fa-envelope" severity="info" v-tooltip.bottom="'Send Letter'" @click="composeLetter(slotProps.data.id)" />
<Button icon="fas fa-icons" severity="info" v-tooltip.bottom="'Set Held Item'" @click="openSetHeldItem(slotProps.data.id)" />
<Button icon="fas fa-bomb" severity="warn" v-tooltip.bottom="'Kick'" @click="kickPlayer($event, slotProps.data.id)" />
<Button icon="fas fa-ban" severity="danger" v-tooltip.bottom="'Ban'" @click="banPlayer($event, slotProps.data.id)" />
</ButtonGroup>
Expand All @@ -231,13 +287,69 @@ onMounted(() => {
</DataTable>
</div>
</div>
<Dialog v-model:visible="isSetHeldItemOpen" modal header="Set Held Item" @close="closeHeldItem" :style="{ width: '30rem' }">
<form @submit.prevent="setHeldItem">
<div class="grid grid-cols-6 gap-2">
<div class="col-span-6">
<label for="item_set_on" class="font-semibold">Set On <span v-if="setHeldItemOn"> (SteamID)</span></label>
<InputText id="item_set_on"
class="w-full mt-1"
name="item_set_on"
:value="setHeldItemOn ?? 'All Players'"
disabled
autocomplete="off" />
</div>
<div class="col-span-4">
<label for="item_id" class="font-semibold">Item ID</label>
<InputText id="item_id"
class="w-full mt-1"
name="item_id"
v-model="heldItemId"
placeholder="Item ID"
required
autocomplete="off" />
</div>
<div class="col-span-2">
<label for="item_size" class="font-semibold">Size</label>
<InputNumber id="item_size"
class="w-full mt-1"
name="item_size"
v-model="heldItemSize"
mode="decimal"
showButtons
:min="0"
:max="12000"
:minFractionDigits="0"
:maxFractionDigits="3"
placeholder="Item Size"
required
autocomplete="off" />
</div>
<div class="col-span-6">
<label for="item_quality" class="font-semibold">Quality</label>
<Select v-model="heldItemQuality"
id="item_quality"
name="item_quality"
class="w-full mt-1"
:options="itemQualities"
optionLabel="name"
optionValue="quality"
placeholder="Item Quality" />
</div>
<div class="col-span-6 flex justify-end gap-2">
<Button type="button" icon="fas fa-ban" label="Cancel" severity="secondary" @click="closeHeldItem" />
<Button type="submit" icon="fas fa-icons" label="Set Item" severity="success" />
</div>
</div>
</form>
</Dialog>
<Dialog v-model:visible="isLetterComposeOpen" modal header="Compose Letter" @close="closeComposeLetter" :style="{ width: '30rem' }">
<form @submit.prevent="sendLetter">
<div class="grid grid-cols-6 gap-2">
<div class="col-span-6">
<label for="recipient" class="font-semibold">Recipient <span v-if="sendLetterTo"> (SteamID)</span></label>
<InputText id="recipient"
class="w-full"
class="w-full mt-1"
name="recipient"
:value="sendLetterTo ?? 'All Players'"
disabled
Expand All @@ -246,7 +358,7 @@ onMounted(() => {
<div class="col-span-6">
<label for="header" class="font-semibold">Header</label>
<InputText id="header"
class="w-full"
class="w-full mt-1"
name="header"
v-model="letterHeader"
placeholder="Letter title"
Expand All @@ -256,7 +368,7 @@ onMounted(() => {
<div class="col-span-6">
<label for="body" class="font-semibold">Message</label>
<Textarea id="body"
class="w-full"
class="w-full mt-1"
name="body"
v-model="letterBody"
placeholder="Your message"
Expand All @@ -266,7 +378,7 @@ onMounted(() => {
<div class="col-span-6">
<label for="closing" class="font-semibold">Closing</label>
<InputText id="closing"
class="w-full"
class="w-full mt-1"
name="closing"
v-model="letterClosing"
placeholder="Letter sign-off"
Expand Down Expand Up @@ -299,9 +411,6 @@ onMounted(() => {
severity="danger"
@click="removeLetterItem(index)" />
</InputGroup>
<div class="col-span-6 text-right">

</div>
</div>
</div>
<div class="col-span-6 flex justify-end gap-2">
Expand Down
32 changes: 26 additions & 6 deletions GLOKON.Baiters.Server/Controllers/UsersController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,38 @@ public IActionResult SendPlayerLetter([FromRoute] string? steamId, [FromBody] Se
return Ok();
}

[HttpPost("cosmetics/{steamId}")]
public IActionResult SetPlayerCosmetics([FromRoute] string steamId, [FromBody] Cosmetics request)
[HttpPost("cosmetics/{steamId?}")]
public IActionResult SetPlayerCosmetics([FromRoute] string? steamId, [FromBody] Cosmetics request)
{
gm.Actioner.SetPlayerCosmetics(ulong.Parse(steamId), request);
if (!string.IsNullOrWhiteSpace(steamId))
{
gm.Actioner.SetPlayerCosmetics(ulong.Parse(steamId), request);
}
else
{
foreach (var player in gm.Server.Players)
{
gm.Actioner.SetPlayerCosmetics(player.Key, request);
}
}

return Ok();
}

[HttpPost("held-item/{steamId}")]
public IActionResult SetPlayerHeldItem([FromRoute] string steamId, [FromBody] HeldItem request)
[HttpPost("held-item/{steamId?}")]
public IActionResult SetPlayerHeldItem([FromRoute] string? steamId, [FromBody] HeldItem request)
{
gm.Actioner.SetPlayerHeldItem(ulong.Parse(steamId), request);
if (!string.IsNullOrWhiteSpace(steamId))
{
gm.Actioner.SetPlayerHeldItem(ulong.Parse(steamId), request);
}
else
{
foreach (var player in gm.Server.Players)
{
gm.Actioner.SetPlayerHeldItem(player.Key, request);
}
}

return Ok();
}
Expand Down

0 comments on commit ea65cbc

Please sign in to comment.