/*
Thor Server Project
Copyright 2008 Joe Hegarty
This file is part of The Thor Server Project.
The Thor Server Project is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The Thor Server Project is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with The Thor Server Project. If not, see .
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ThorServer.Core;
using ThorServer.Utilities;
namespace ThorServer.Game.Rooms
{
public class RoomReactor : Reactor
{
//2 - "room_directory": "@B"
public void Listener2()
{
int roomId = InstanceManager.Sessions.GetSession(mSessionID).mRoomID;
if (roomId != 0)
{
InstanceManager.Game.Rooms.GetRoomInstance(roomId).RemoveUser(mSessionID);
}
int requestType = Base64Encoding.DecodeInt(mPacketBody.Substring(0, 1));
roomId = ArgumentEncoding.decodeInt(mPacketBody.Substring(1));
mMessage.Init(19); //@S
SendMessage(mMessage);
if (requestType == 1) // Public
{
enterRoom(roomId, false);
}
}
//16 - "SUSERF": "@P"
public void Listener16()
{
string searchResult = InstanceManager.Game.Navigator.GetOwnRoomSearchResult(mUserInfo.userId);
if (searchResult != null)
{
mMessage.Init(16); //@P
mMessage.appendString(searchResult);
}
else
{
mMessage.Init(57); //@y
}
SendMessage(mMessage);
}
//17 - "SRCHF": "@Q"
public void Listener17()
{
string searchResult = InstanceManager.Game.Navigator.GetRoomSearchResult(mPacketBody, mUserInfo.userId);
if (searchResult != null)
{
mMessage.Init(55); //@w
mMessage.appendString(searchResult);
}
else
{
mMessage.Init(58); //@z
}
SendMessage(mMessage);
}
//17 - "GETFVRF": "@R"
public void Listener18()
{
string searchResult = InstanceManager.Game.Navigator.GetFavouriteSearchResult(mUserInfo.userId, mUserInfo.iRole);
mMessage.Init(61); // @}
mMessage.appendString(searchResult);
SendMessage(mMessage);
}
//18 - "ADD_FAVORITE_ROOM": "@S"
public void Listener19()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody.Substring(1));
List favRooms = InstanceManager.Game.Users.GetFavouriteRooms(mUserInfo.userId);
if (favRooms.Count < int.Parse(Users.UserSettings.MaxFavouriteRooms))
{
if (!favRooms.Contains(roomId))
{
InstanceManager.Game.Users.AddFavouriteRoom(mUserInfo.userId, roomId);
}
}
else
{
ReportError("nav_error_toomanyfavrooms", false);
}
}
//19 - "DEL_FAVORITE_ROOM": "@T"
public void Listener20()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody.Substring(1));
InstanceManager.Game.Users.DeleteFavouriteRoom(mUserInfo.userId, roomId);
}
//21 - "GETFLATINFO": "@U"
public void Listener21()
{
int roomId = int.Parse(mPacketBody);
RoomInstance roomInstance = InstanceManager.Game.Rooms.GetRoomInstance(roomId);
RoomInfo roomInfo = roomInstance.RoomInfo;
RoomCategory catInfo = InstanceManager.Game.Rooms.GetCategory(roomInfo.RoomCategory);
mMessage.Init(54); //@v
mMessage.appendArgumentInt(roomInfo.SuperUsers);
mMessage.appendArgumentInt(InstanceManager.Game.Rooms.GetRoomStateInt(roomInfo.RoomStatus));
mMessage.appendArgumentInt(roomId);
if (roomInfo.ShowOwner == 1 || InstanceManager.Game.Roles.HasRight(mUserInfo.iRole, "fuse_see_all_roomowners") || roomInfo.RoomOwner == mUserInfo.userId)
{
mMessage.appendString(InstanceManager.Game.Users.GetUser(roomInfo.RoomOwner).sUsername);
}
else
{
mMessage.appendString("-");
}
mMessage.appendChar(2);
mMessage.appendString(roomInfo.RoomModel);
mMessage.appendChar(2);
mMessage.appendString(roomInfo.RoomName);
mMessage.appendChar(2);
mMessage.appendString(roomInfo.RoomDescription);
mMessage.appendChar(2);
mMessage.appendArgumentInt(roomInfo.ShowOwner);
mMessage.appendArgumentInt(catInfo.CanTrade);
mMessage.appendArgumentInt(roomInstance.UserCount);
mMessage.appendArgumentInt(roomInfo.MaxUsers);
SendMessage(mMessage);
}
//23 - "DELETEFLAT": "@W"
public void Listener23()
{
int roomId = int.Parse(mPacketBody);
RoomInfo room = InstanceManager.Game.Rooms.GetRoom(roomId);
if (room.RoomOwner == mUserInfo.userId)
{
InstanceManager.Game.Rooms.DeleteRoom(roomId);
}
}
//24 - "UPDATEFLAT": "@X"
public void Listener24()
{
string[] parts = mPacketBody.Split('/');
bool invalid = false;
int roomId = 0;
if (!int.TryParse(parts[0], out roomId)) invalid = true;
string roomName = SpecialFiltering.FilterChars("2,9,13,47", parts[1]);
string roomStatus = parts[2];
if (InstanceManager.Game.Rooms.GetRoomStateInt(roomStatus) == -1) invalid = true;
int showOwner = 0;
if (!int.TryParse(parts[3], out showOwner)) invalid = true;
if (!invalid && InstanceManager.Game.Rooms.RoomExists(roomId))
{
RoomInfo info = InstanceManager.Game.Rooms.GetRoom(roomId);
info.RoomName = roomName;
info.RoomStatus = roomStatus;
info.ShowOwner = showOwner;
InstanceManager.Game.Rooms.UpdateRoom(info);
}
}
//25 - "SETFLATINFO": "@Y"
public void Listener25()
{
string rId = "";
int roomId = 0;
if (mPacketBody.Substring(0, 1) == "/")
rId = mPacketBody.Split('/')[1];
else
rId = mPacketBody.Split('/')[0];
if (int.TryParse(rId, out roomId))
{
RoomInfo roomInfo = InstanceManager.Game.Rooms.GetRoom(roomId);
if (roomInfo.RoomOwner == mUserInfo.userId)
{
string[] payLoad = mPacketBody.Split(Convert.ToChar(13));
for (int i = 1; i < payLoad.Length; i++)
{
string updateHeader = payLoad[i].Split('=')[0];
string updateBody = "";
if (payLoad[i].Length > updateHeader.Length + 1) updateBody = payLoad[i].Substring(updateHeader.Length + 1);
switch (updateHeader)
{
case "description":
roomInfo.RoomDescription = SpecialFiltering.FilterChars("2,9,13,47", updateBody);
break;
case "maxvisitors":
int maxvis = 0;
if(int.TryParse(updateBody, out maxvis))
{
roomInfo.MaxUsers = maxvis;
}
break;
case "allsuperuser":
int allsuper = 0;
if (int.TryParse(updateBody, out allsuper))
{
if (allsuper == 1 || allsuper == 0)
{
roomInfo.SuperUsers = allsuper;
}
}
break;
case "password":
roomInfo.Password = SpecialFiltering.FilterChars("2,9,13,47", updateBody);
break;
}
}
InstanceManager.Game.Rooms.UpdateRoom(roomInfo);
}
}
}
//29 - "CREATEFLAT": "@]"
public void Listener29()
{
string[] parts = mPacketBody.Split('/');
bool invalid = false;
string roomName = SpecialFiltering.FilterChars("2,9,13,47", parts[2]);
string roomModel = parts[3];
if (!InstanceManager.Game.Rooms.UserRoomExists(roomModel)) invalid = true;
if (InstanceManager.Game.Rooms.GetUserType(roomModel) == 2)
{
if (!InstanceManager.Game.Roles.HasRight(mUserInfo.iRole, "fuse_use_special_room_layouts")) invalid = true;
}
string roomStatus = parts[4];
if (InstanceManager.Game.Rooms.GetRoomStateInt(roomStatus) == -1) invalid = true;
int showOwner = 0;
if (!int.TryParse(parts[5], out showOwner)) invalid = true;
if (!invalid)
{
int roomId = InstanceManager.Game.Rooms.CreateRoom(roomName, roomModel, roomStatus, showOwner, mUserInfo.userId);
mMessage.Init(59); // @{
mMessage.appendInt(roomId);
mMessage.appendChar(13);
mMessage.appendString(roomName);
SendMessage(mMessage);
}
else
{
mMessage.Init(139); //BK
mMessage.appendString(Language.roomCreationFailed);
SendMessage(mMessage);
}
}
//53 - "HV": "@u"
public void Listener53()
{
InstanceManager.Sessions.GetSession(mSessionID).waitingFlat = 0;
int roomId = InstanceManager.Sessions.GetSession(mSessionID).mRoomID;
if (roomId != 0)
{
InstanceManager.Game.Rooms.GetRoomInstance(roomId).RemoveUser(mSessionID);
}
}
//54 - "GOVIADOOR": "@v"
public void Listener54()
{
int roomId = 0;
int doorId = 0;
string[] parts = mPacketBody.Split('/');
if (int.TryParse(parts[0], out roomId) && int.TryParse(parts[1], out doorId))
{
if (InstanceManager.Sessions.GetSession(mSessionID).authenticatedFlat == roomId)
{
if (InstanceManager.Sessions.GetSession(mSessionID).authenticatedDoor == doorId)
{
InstanceManager.Game.Rooms.GetRoomInstance(roomId).mDoorEntries.Add(mSessionID, doorId);
mMessage.Init(19); //@S
SendMessage(mMessage);
}
}
}
}
//57 - "TRYFLAT": "@y"
public void Listener57()
{
int roomId = 0;
bool result = false;
string roomPassword = null;
if (mPacketBody.Contains('/'))
{
roomId = int.Parse(mPacketBody.Split('/')[0]);
roomPassword = mPacketBody.Split('/')[1];
}
else
{
roomId = int.Parse(mPacketBody);
}
if (!InstanceManager.Game.Roles.HasRight(mUserInfo.iRole, "fuse_enter_locked_rooms"))
{
if (InstanceManager.Sessions.GetSession(mSessionID).authenticatedDoor > 0 && InstanceManager.Sessions.GetSession(mSessionID).authenticatedFlat == roomId) //Entering via door
{
InstanceManager.Sessions.GetSession(mSessionID).authenticatedDoor = 0;
result = true;
}
else
{
RoomInfo roomInfo = InstanceManager.Game.Rooms.GetRoom(roomId);
if (mUserInfo.userId == roomInfo.RoomOwner)
{
result = true;
}
else
{
if (roomInfo.RoomStatus == "open") // Open
{
result = true;
}
else if (roomInfo.RoomStatus == "closed") //Doorbell
{
if (InstanceManager.Game.Rooms.InstanceExists(roomId))
{
if (InstanceManager.Game.Rooms.GetRoomInstance(roomId).BroadcastRingingUser(mUserInfo.sUsername))
{
InstanceManager.Sessions.GetSession(mSessionID).waitingFlat = roomId;
}
else
{
mMessage.Init(131); //BC
SendMessage(mMessage);
}
}
else
{
mMessage.Init(131); //BC
SendMessage(mMessage);
}
}
else if (roomInfo.RoomStatus == "password") //Password
{
if (roomInfo.Password == roomPassword)
{
result = true;
}
else
{
ReportError("Incorrect flat password", false);
}
}
}
}
}
else
{
result = true;
}
if (result)
{
InstanceManager.Sessions.GetSession(mSessionID).authenticatedFlat = roomId;
mMessage.Init(41); // @i
SendMessage(mMessage);
}
}
//59 - "GOTOFLAT": "@{"
public void Listener59()
{
int roomId = int.Parse(mPacketBody);
if (roomId == InstanceManager.Sessions.GetSession(mSessionID).authenticatedFlat)
{
enterRoom(roomId, false);
}
}
private void enterRoom(int roomId, bool overrideChecks)
{
RoomInstance roomInstance = InstanceManager.Game.Rooms.GetRoomInstance(roomId);
roomInstance.AddUser(mSessionID);
RoomInfo roomInfo = InstanceManager.Game.Rooms.GetRoom(roomId);
if (!InstanceManager.Game.Rooms.GetCategory(roomInfo.RoomCategory).SystemCategory || InstanceManager.Game.Roles.HasRight(mUserInfo.iRole, "fuse_see_system_categories") || overrideChecks)
{
if (roomInstance.UserCount < roomInfo.MaxUsers || InstanceManager.Game.Roles.HasRight(mUserInfo.iRole, "fuse_enter_full_rooms") || overrideChecks)
{
mMessage.Init(166); //Bf
mMessage.appendString("about:blank");
SendMessage(mMessage);
mMessage.Init(69); //AE
mMessage.appendString(roomInfo.RoomModel);
SendMessage(mMessage);
if (roomInfo.IsGuestRoom)
{
mMessage.Init(46); //@n
mMessage.appendString("wallpaper/");
mMessage.appendInt(roomInfo.Wallpaper);
SendMessage(mMessage);
mMessage.Init(46); //@n
mMessage.appendString("floor/");
mMessage.appendInt(roomInfo.Floor);
SendMessage(mMessage);
}
}
else
{
mMessage.Init(18); // @R
SendMessage(mMessage);
mMessage.Init(139); //BK
mMessage.appendString(Language.roomFull);
SendMessage(mMessage);
}
}
else
{
mMessage.Init(18); // @R
SendMessage(mMessage);
mMessage.Init(139); //BK
mMessage.appendString("Need: fuse_see_system_categories");
SendMessage(mMessage);
}
}
//150 - NAVIGATE": "BV"
public void Listener150()
{
int hideFull = ArgumentEncoding.decodeInt(mPacketBody.Substring(0, 1));
string navId = mPacketBody.Substring(1);
navId = navId.Substring(0, navId.Length - 1);
int navCat = ArgumentEncoding.decodeInt(navId);
mMessage.Init(220); //C\
mMessage.appendString(InstanceManager.Game.Navigator.GetNavigatorResponse(navCat, hideFull, mUserInfo));
SendMessage(mMessage);
}
//151 - "GETUSERFLATCATS": "BW"
public void Listener151()
{
mMessage.Init(221);
mMessage.appendString(InstanceManager.Game.Navigator.BuildPrivateCategoryResponse());
SendMessage(mMessage);
}
//152 - "GETFLATCAT": "BX"
public void Listener152()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody);
RoomInfo info = InstanceManager.Game.Rooms.GetRoom(roomId);
if(info != null)
{
mMessage.Init(222); //C^
mMessage.appendString(ArgumentEncoding.encodeInt(info.RoomID));
mMessage.appendString(ArgumentEncoding.encodeInt(info.RoomCategory));
SendMessage(mMessage);
}
}
//153 - "SETFLATCAT": "BY"
public void Listener153()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody);
int catId = ArgumentEncoding.decodeInt(mPacketBody.Substring(ArgumentEncoding.getLength(roomId)) + 1);
RoomInfo info = InstanceManager.Game.Rooms.GetRoom(roomId);
RoomCategory cat = InstanceManager.Game.Rooms.GetCategory(catId);
if (info != null && cat != null)
{
if (cat.PlayerCategory)
{
info.RoomCategory = catId;
InstanceManager.Game.Rooms.UpdateRoom(info);
}
}
}
//154 - "GETSPACENODEUSERS": "BZ"
public void Listener154()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody);
string payload = "";
if(InstanceManager.Game.Rooms.InstanceExists(roomId))
{
payload = InstanceManager.Game.Rooms.GetRoomInstance(roomId).UserList;
}
mMessage.Init(223); //C_
mMessage.appendString(payload);
SendMessage(mMessage);
}
//155 - "REMOVEALLRIGHTS": "B["
public void Listener155()
{
int roomId = ArgumentEncoding.decodeInt(mPacketBody);
RoomInfo info = InstanceManager.Game.Rooms.GetRoom(roomId);
if (mUserInfo.userId == info.RoomOwner)
{
InstanceManager.Game.Rooms.DeleteAllRights(roomId);
}
}
//182 - "GETINTERST": "Bv"
public void Listener182()
{
mMessage.Init(258); //DB
mMessage.appendInt(0);
SendMessage(mMessage);
}
}
}