Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions Areas/Housekeeping/Controllers/BotsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using Microsoft.AspNetCore.Mvc;
using KeplerCMS.Filters;
using KeplerCMS.Services.Interfaces;
using System.Threading.Tasks;
using KeplerCMS.Areas.Housekeeping.Models.Views;
using KeplerCMS.Data.Models;
using KeplerCMS.Models;
using KeplerCMS.Models.Enums;

namespace KeplerCMS.Areas.Housekeeping
{
[Area("Housekeeping")]
public class BotsController : Controller
{
private readonly ICommandQueueService _commandQueueService;
private readonly IBotService _botService;
private readonly IRoomService _roomService;

public BotsController(ICommandQueueService commandQueueService, IBotService botService, IRoomService roomService)
{
_commandQueueService = commandQueueService;
_botService = botService;
_roomService = roomService;
}



[HousekeepingFilter(Fuse.fuse_bots)]
public async Task<IActionResult> GetAllPublicRooms()
{
var rooms = await _roomService.GetPublicRooms();

return Json(rooms);
}

[HousekeepingFilter(Fuse.fuse_bots)]
public async Task<IActionResult> GetBot(int id)
{
var bot = await _botService.Get(id);

return Json(bot);
}


[HousekeepingFilter(Fuse.fuse_bots)]
public async Task<IActionResult> UpdateBot([FromBody] Bots bot)
{
var success = await _botService.UpdateBot(bot);

return Json(success);
}


[HousekeepingFilter(Fuse.fuse_bots)]
public async Task<IActionResult> Index(string Message = null)
{
ViewBag.Message = Message;
var bots = await _botService.GetAllBots();

return View(new BotsListView { Bots = bots });
}
}
}
17 changes: 17 additions & 0 deletions Areas/Housekeeping/Models/Views/BotsViewModels.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using KeplerCMS.Data.Models;
using KeplerCMS.Models;

namespace KeplerCMS.Areas.Housekeeping.Models.Views
{
public class BotsListView
{
public IEnumerable<Bots> Bots { get; set; }
}


}
230 changes: 230 additions & 0 deletions Areas/Housekeeping/Views/Bots/Index.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
@model KeplerCMS.Areas.Housekeeping.Models.Views.BotsListView

@{
ViewBag.Title = "Bots";
}

<h1>@ViewBag.Title</h1>
<p>
Here you can see a list of all the bots on the hotel.
</p>
@if (ViewBag.Message != null)
{
<p>@ViewBag.Message</p>
}
<table class="habboTable">
<thead>
<tr>
<th>Room</th>
<th>Name</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@{
foreach (var bot in Model.Bots)
{
<tr data-id="@bot.Id">
<td>@bot.Room.Name</td>
<td class="botName">@bot.Name</td>
<td>
<button class="btn btn-primary" onclick="editBot('@bot.Id')">Edit</button>
</td>
</tr>
}
}
</tbody>
</table>




@section scripts {
<script>
async function editBot(id) {
const bot = await fetch('@Url.Action("GetBot")' + '/' + id);
const room = await fetch('@Url.Action("GetAllPublicRooms")');
const botResponse = await bot.json();
const roomResponse = await room.json();

let roomOptions = [];

roomOptions = roomResponse.map(room => {
if (room.id === botResponse.roomId) {
return `<option value="${room.id}" selected>${room.name}</option>`;
}
return `<option value="${room.id}">${room.name}</option>`;
});

let speeches = [];

if (botResponse.speech.length > 0) {

speeches = botResponse.speech.split("|").map(speech => {
return `<input class="swal2-input" name="speech" value="${speech}">`;
});
}

let response = [];

if (botResponse.response.length > 0) {

response = botResponse.response.split("|").map(speech => {
return `<input class="swal2-input" name="response" value="${speech}">`;
});
}

let unrecognised_response = [];

if (botResponse.unrecognisedResponse.length > 0) {

unrecognised_response = botResponse.unrecognisedResponse.split("|").map(speech => {
return `<input class="swal2-input" name="unrecognised_response" value="${speech}">`;
});
}



const { value: formValues } = await Swal.fire({
title: "Edit bot " + botResponse.name,
showCloseButton: true,
width: 600,
showCancelButton: true,
html: `
<input type="hidden" id="id" value="${botResponse.id}">
<label for="name">Name</label>
<input id="name" class="swal2-input" value="${botResponse.name}">

<label for="mission">Mission</label>
<input id="mission" class="swal2-input" value="${botResponse.mission}">

<label for="figure">Figure</label>
<input id="figure" class="swal2-input" value="${botResponse.figure}">

<label for="room">Room</label>
<select id="room" class="swal2-input">
${roomOptions}
</select>

<fieldset>
<legend>Position</legend>
<label for="start_look">Start look rotation</label>
<input id="start_look" class="swal2-input" value="${botResponse.startLook}">

<label for="x">Start X coordinate</label>
<input id="x" class="swal2-input" value="${botResponse.x}">

<label for="y">Start Y coordinate</label>
<input id="y" class="swal2-input" value="${botResponse.y}">

<label for="walkspace">Walkspace</label>
<input id="walkspace" class="swal2-input" value="${botResponse.walkspace}">
</fieldset>

<fieldset>
<legend>Speeches</legend>
<p>End the chat with #WHISPER or #SHOUT to make the bot shout or whisper</P>
<button class="btn btn-primary" id="addSpeech" onclick="addSpeech()">Add speech</button>
<div id="speeches">
${speeches}
</div>
</fieldset>

<fieldset>
<legend>Unrecognised response</legend>
<button class="btn btn-primary" id="addUnrecognisedResponse" onclick="addUnrecognisedResponse()">Add unrecognised response</button>
<div id="unrecognised_response">
${unrecognised_response}
</div>

</fieldset>

<fieldset>
<legend>Hand item responses</legend>
<p>Use %lowercaseDrink% to indicate the drink name</P>
<button class="btn btn-primary" id="addResponse" onclick="addResponse()">Add response</button>
<div id="response">
${response}
</div>
</fieldset>

<label for="hand_itmes">Hand items</label>
<input id="hand_items" class="swal2-input" value="${botResponse.handItems}">


`,
focusConfirm: false,
preConfirm: () => {
const result = {
id: Number(document.getElementById('id').value),
name: document.getElementById('name').value,
roomId: Number(document.getElementById('room').value),
mission: document.getElementById('mission').value,
speech: Array.from(document.getElementsByName('speech')).map(speech => speech.value).join("|"),
response: Array.from(document.getElementsByName('response')).map(speech => speech.value).join("|"),
unrecognisedResponse: Array.from(document.getElementsByName('unrecognised_response')).map(speech => speech.value).join("|"),
figure: document.getElementById('figure').value,
startLook: document.getElementById('start_look').value,
x: Number(document.getElementById('x').value),
y: Number(document.getElementById('y').value),
walkspace: document.getElementById('walkspace').value,
handItems: document.getElementById('hand_items').value
};
console.log(result);
return result;
}
});
// Bind using jQuery

$('#addSpeech').click(addSpeech);
$('#addResponse').click(addResponse);
$('#addUnrecognisedResponse').click(addUnrecognisedResponse);

if (formValues) {
const response = await fetch('@Url.Action("UpdateBot")', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(formValues)
});
const data = await response.json();
if (response.ok) {
Swal.fire({
title: 'Bot updated',
icon: 'success'
});
// Also update the UI
const fetchPublicRooms = await fetch('@Url.Action("GetAllPublicRooms")');
const publicRooms = await fetchPublicRooms.json();

const room = publicRooms.find(room => room.id === formValues.roomId);
const roomName = document.querySelector(`tr[data-id="${formValues.id}"] td:first-child`);
roomName.textContent = room.name;

const botName = document.querySelector(`tr[data-id="${formValues.id}"] .botName`);
botName.textContent = formValues.name;


} else {
Swal.fire({
title: 'Error',
text: data.message,
icon: 'error'
});
}
}
}
function addSpeech() {
$('#speeches').prepend('<input class="swal2-input" name="speech" placeholder="Enter speech" name="speech">');
}

function addResponse() {
$('#response').prepend('<input class="swal2-input" name="response" placeholder="Enter response">');
}

function addUnrecognisedResponse() {
$('#unrecognised_response').prepend('<input class="swal2-input" name="unrecognised_response" placeholder="Enter unrecognised response">');
}
</script>
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
{ "/housekeeping/messengercampaign", HousekeepingMenu.AdminTools },
{ "/housekeeping/settings", HousekeepingMenu.AdminTools },
{ "/housekeeping/auditlog", HousekeepingMenu.AdminTools },
{ "/housekeeping/bots", HousekeepingMenu.AdminTools },
{ "/housekeeping/rewards", HousekeepingMenu.AdminTools },
};

Expand Down Expand Up @@ -117,6 +118,7 @@
@await menuHelper.Render("Audit log", Url.Action("Index", "AuditLog"), new List<Fuse> { Fuse.fuse_administrator_access })
@await menuHelper.Render("Reward management", Url.Action("Index", "Rewards"), new List<Fuse> { Fuse.housekeeping_rewards })
@await menuHelper.Render("Catalogue", Url.Action("Index", "Catalogue"), new List<Fuse> { Fuse.fuse_administrator_access })
@await menuHelper.Render("Bots", Url.Action("Index", "Bots"), new List<Fuse> { Fuse.fuse_bots })
</ul>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion Controllers/Api/HotelApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public async Task<IActionResult> UserSearch(string user)
[Route("components/roomNavigation")]
public IActionResult RoomNavigation(int roomId, string roomType)
{
_commandQueueService.QueueCommand(Models.Enums.CommandQueueType.roomForward, new Models.CommandTemplate { UserId = int.Parse(User.Identity.Name), RoomId = roomId, RoomType = roomType });
_commandQueueService.QueueCommand(Models.Enums.CommandQueueType.room_forward, new Models.CommandTemplate { UserId = int.Parse(User.Identity.Name), RoomId = roomId, RoomType = roomType });
return Content("ok");
}

Expand Down
1 change: 1 addition & 0 deletions Data/DataContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)

}
public DbSet<Users> Users { get; set; }
public DbSet<Bots> Bots { get; set; }
public DbSet<CommandQueue> CommandQueue { get; set; }
public DbSet<Menu> Menu { get; set; }
public DbSet<Containers> Containers { get; set; }
Expand Down
Loading
Loading