Ejemplo n.º 1
0
        public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args)
        {
            var sessionState = SessionManager.sessionStates[UserID];
            var xtlk         = new MSG_XTALK();

            if (TargetID == 0)
            {
                xtlk.text = "Sorry, you must target a user to use this command.";

                sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0);
            }
            else
            {
                var targetSessionState = SessionManager.sessionStates[TargetID];

                foreach (var asset in targetSessionState.details.propSpec)
                {
                    var dbAsset = dbContext.Assets
                                  .Where(a => a.AssetId == asset.id)
                                  .FirstOrDefault();

                    if (dbAsset != null)
                    {
                        dbContext.Assets.Remove(dbAsset);
                    }
                }

                if (dbContext.HasUnsavedChanges())
                {
                    dbContext.SaveChanges();
                }

                targetSessionState.details.nbrProps = 0;
                targetSessionState.details.propSpec = null;

                SessionManager.SendToRoomID(targetSessionState.RoomID, 0, new MSG_USERPROP
                {
                    nbrProps = 0,
                    propSpec = null,
                }, EventTypes.MSG_USERPROP, (Int32)targetSessionState.UserID);

                xtlk.text = $"{targetSessionState.details.name}'s avatar has been eraised!";

                sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0);
            }

            return(true);
        }
Ejemplo n.º 2
0
        public void Receive(ThePalaceEntities dbContext, object message)
        {
            var sessionState  = ((Message)message).sessionState;
            var protocol      = ((Message)message).protocol;
            var header        = ((Message)message).header;
            var inboundPacket = (Protocols.MSG_USERDESC)protocol;
            var user          = dbContext.UserData
                                .Where(u => u.UserId == sessionState.UserID)
                                .FirstOrDefault();

            user.FaceNbr  = inboundPacket.faceNbr;
            user.ColorNbr = inboundPacket.colorNbr;

            dbContext.SaveChanges();

            if (!sessionState.Authorized)
            {
                if ((sessionState.userFlags & (int)(UserFlags.U_PropGag | UserFlags.U_Pin)) != 0)
                {
                    sessionState.details.faceNbr  = inboundPacket.faceNbr;
                    sessionState.details.colorNbr = inboundPacket.colorNbr;


                    sessionState.details.nbrProps = 0;
                    sessionState.details.propSpec = null;

                    return;
                }
            }

            sessionState.details.faceNbr  = inboundPacket.faceNbr;
            sessionState.details.colorNbr = inboundPacket.colorNbr;
            sessionState.details.nbrProps = (Int16)inboundPacket.nbrProps;
            sessionState.details.propSpec = inboundPacket.propSpec;

            AssetLoader.CheckAssets(sessionState, inboundPacket.propSpec);

            SessionManager.SendToRoomID(sessionState.RoomID, 0, inboundPacket, (EventTypes)Enum.Parse(typeof(EventTypes), header.eventType), header.refNum);
        }
Ejemplo n.º 3
0
        public void Receive(ThePalaceEntities dbContext, object message)
        {
            var sessionState = ((Message)message).sessionState;
            var maxRoomId    = dbContext.Rooms
                               .Select(r => r.RoomId)
                               .Max();
            var maxOrderId = dbContext.Rooms
                             .Select(r => r.OrderID)
                             .Max();

            maxRoomId++;
            maxOrderId++;

            var newRoom = new Rooms
            {
                RoomId       = maxRoomId,
                Name         = $"New Room {maxRoomId}",
                CreateDate   = DateTime.UtcNow,
                OrderID      = maxOrderId,
                MaxOccupancy = 0,
                Flags        = 0,
            };

            dbContext.Rooms.Add(newRoom);

            var newRoomData = new RoomData
            {
                RoomId      = maxRoomId,
                FacesId     = 0,
                Password    = null,
                PictureName = "clouds.png",
                ArtistName  = sessionState.Name,
            };

            dbContext.RoomData.Add(newRoomData);

            dbContext.SaveChanges();

            Logger.Log(MessageTypes.Info, $"MSG_ROOMNEW[{sessionState.AuthUserID}]: {newRoom.Name}");

            var room = dbContext.GetRoom(maxRoomId);

            if (!room.NotFound)
            {
                sessionState.RoomID = room.ID;

                var sendBusinesses = new List <ISendBusiness>
                {
                    new MSG_ROOMDESC(),
                    new MSG_USERLIST(),
                    new MSG_ROOMDESCEND(),
                };

                foreach (var sendBusiness in sendBusinesses)
                {
                    sendBusiness.Send(dbContext, message);
                }

                new MSG_USERNEW().SendToRoomID(dbContext, message);
            }
        }
Ejemplo n.º 4
0
        public void Send(ThePalaceEntities dbContext, object message)
        {
            var sessionState = ((Message)message).sessionState;
            var roomID       = dbContext.FindRoomID(sessionState.reg.desiredRoom);

            if (roomID == 0)
            {
                new MSG_SERVERDOWN
                {
                    reason     = ServerDownFlags.SD_ServerFull,
                    whyMessage = "The Server is full!",
                }.Send(dbContext, message);

                sessionState.driver.DropConnection();

                return;
            }

            sessionState.RoomID = roomID;
            sessionState.successfullyConnected = true;

            var sendBusinesses = new List <ISendBusiness>
            {
                new MSG_ALTLOGONREPLY(),
                new MSG_VERSION(),
                new MSG_SERVERINFO(),
                new MSG_USERSTATUS(),
            };

            foreach (var sendBusiness in sendBusinesses)
            {
                sendBusiness.Send(dbContext, message);
            }

            new MSG_USERLOG().SendToServer(dbContext, message);

            using (var dbContextTransaction = dbContext.Database.BeginTransaction())
            {
                try
                {
                    dbContext.Users1.Add(new Users1
                    {
                        UserId = (Int32)sessionState.UserID,
                        Name   = sessionState.reg.userName,
                        RoomId = sessionState.RoomID,
                        Flags  = sessionState.userFlags,
                    });

                    dbContext.UserData.Add(new UserData
                    {
                        UserId     = (Int32)sessionState.UserID,
                        RoomPosH   = sessionState.details.roomPos.h,
                        RoomPosV   = sessionState.details.roomPos.v,
                        FaceNbr    = sessionState.details.faceNbr,
                        ColorNbr   = sessionState.details.colorNbr,
                        AwayFlag   = 0,
                        OpenToMsgs = 0,
                    });

                    dbContext.SaveChanges();

                    dbContextTransaction.Commit();
                }
                catch (Exception ex)
                {
                    dbContextTransaction.Rollback();

                    ex.DebugLog();
                }
            }

            new MSG_HTTPSERVER().Send(dbContext, message);

            new MSG_ROOMGOTO().Receive(dbContext, new Message
            {
                sessionState = sessionState,
                protocol     = new Protocols.MSG_ROOMGOTO
                {
                    dest = sessionState.RoomID,
                },
            });
        }
Ejemplo n.º 5
0
        public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args)
        {
            var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null;
            var xtlk         = new MSG_XTALK();

            if (TargetID == 0 && args.Length < 1)
            {
                xtlk.text = "A target user or parameter is required for this command.";
            }

            if (TargetID != 0)
            {
                var targetSessionState = SessionManager.sessionStates[TargetID];

                if (targetSessionState.Authorized)
                {
                    xtlk.text = "Sorry, you may not perform this command on another staff member.";

                    sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0);
                }
                else
                {
                    var ipAddress  = targetSessionState.driver.GetIPAddress();
                    var serverDown = new Business.MSG_SERVERDOWN
                    {
                        reason     = ServerDownFlags.SD_Banished,
                        whyMessage = "You have been banned!",
                    };

                    SessionManager.sessionStates.Values.ToList().ForEach(state =>
                    {
                        if (state.driver.GetIPAddress() == ipAddress)
                        {
                            serverDown.Send(dbContext, new Message
                            {
                                sessionState = state,
                            });

                            state.driver.DropConnection();
                        }

                        dbContext.Bans.Add(new Bans
                        {
                            Ipaddress = ipAddress,
                            RegCtr    = (Int32)state.reg.counter,
                            RegCrc    = (Int32)state.reg.crc,
                            Puidctr   = (Int32)state.reg.puidCtr,
                            Puidcrc   = (Int32)state.reg.puidCRC,
                            Note      = state.details.name,
                            UntilDate = null,
                        });
                    });
                }
            }

            if (args != null && args.Length > 0)
            {
                var bans       = new List <Bans>();
                var serverDown = new Business.MSG_SERVERDOWN
                {
                    reason     = ServerDownFlags.SD_Banished,
                    whyMessage = "You have been banned!",
                };

                foreach (var _arg in args)
                {
                    var arg = _arg.Trim();

                    if (Regex.IsMatch(arg, "^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$"))
                    {
                        bans.Add(new Bans
                        {
                            Ipaddress = arg,
                            UntilDate = null,
                        });
                    }

                    if (Regex.IsMatch(arg, @"^[\{]*[A-Q][\}]*$"))
                    {
                        var seed = Cipher.WizKeytoSeed(arg);
                        var crc  = Cipher.ComputeLicenseCrc((UInt32)seed);
                        var ctr  = Cipher.GetSeedFromReg((UInt32)seed, crc);

                        bans.Add(new Bans
                        {
                            RegCrc    = (Int32)crc,
                            RegCtr    = ctr,
                            UntilDate = null,
                        });
                    }

                    if (Regex.IsMatch(arg, @"^[\{]*[Z][A-Q][\}]*$"))
                    {
                        var seed = Cipher.WizKeytoSeed(arg);
                        var crc  = Cipher.ComputeLicenseCrc((UInt32)seed);
                        var ctr  = Cipher.GetSeedFromPUID((UInt32)seed, crc);

                        bans.Add(new Bans
                        {
                            Puidcrc   = (Int32)crc,
                            Puidctr   = ctr,
                            UntilDate = null,
                        });
                    }
                }

                SessionManager.sessionStates.Values.ToList().ForEach(state =>
                {
                    foreach (var ban in bans)
                    {
                        if (state.driver.GetIPAddress() == ban.Ipaddress ||
                            (state.reg.crc == ban.RegCrc && state.reg.counter == ban.RegCtr) ||
                            (state.reg.puidCRC == ban.Puidcrc && state.reg.puidCtr == ban.Puidctr))
                        {
                            ban.Note = state.details.name;

                            serverDown.Send(dbContext, new Message
                            {
                                sessionState = state,
                            });

                            state.driver.DropConnection();
                        }
                    }
                });

                if (bans.Count > 0)
                {
                    dbContext.Bans.AddRange(bans);
                }
            }

            if (dbContext.HasUnsavedChanges())
            {
                dbContext.SaveChanges();

                xtlk.text = "Ban record(s) added...";
            }
            else
            {
                xtlk.text = "Usage: `ban [<target user>] or [<IP|REG|PUID>]";
            }

            if (UserID == 0xFFFFFFFF)
            {
                Logger.ConsoleLog(xtlk.text);
            }
            else
            {
                sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0);
            }

            return(true);
        }
Ejemplo n.º 6
0
        public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args)
        {
            var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null;

            var xtlk = new MSG_XTALK
            {
                text = $"Purging Props",
            };

            if (args.Length <= 0)
            {
                xtlk.text = $"Clearing Room[{sessionState.RoomID}] Loose Props, issued by [{sessionState.UserID}] {sessionState.details.name}";

                SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0);
                Logger.ConsoleLog(xtlk.text);

                dbContext.LooseProps2.RemoveRange(dbContext.LooseProps2.AsNoTracking().Where(m => m.RoomId == sessionState.RoomID).ToList());
            }
            else
            {
                for (int i = 0; i < args.Length; i++)
                {
                    var arg = args[i];

                    if (!arg.Substring(0, 1).Equals("-"))
                    {
                        xtlk.text = "Invalid Paramters for PurgeProps specified";

                        if (UserID != 0xFFFFFFFF)
                        {
                            SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0);
                        }

                        Logger.ConsoleLog(xtlk.text);
                        break;
                    }

                    if (arg.Contains("T"))
                    {
                        if ((i + 1) >= args.Length)
                        {
                            xtlk.text = "[T]ime Operation requires a DateTime string to be passed";

                            if (UserID != 0xFFFFFFFF)
                            {
                                SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0);
                            }

                            Logger.ConsoleLog(xtlk.text);
                            break;
                        }

                        var time = args[i + 1].TryParse <DateTime>();

                        if (!time.HasValue)
                        {
                            xtlk.text = "Invalid DateTime format";

                            if (UserID != 0xFFFFFFFF)
                            {
                                SessionManager.SendToUserID(sessionState.UserID, xtlk, EventTypes.MSG_XTALK, 0);
                            }

                            Logger.ConsoleLog("Invalid DateTime format");
                            return(true);
                        }

                        xtlk.text = $"Removing Props Older than {time.ToString()}, issued by [{sessionState.UserID}] {sessionState.details.name}";
                        SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0);
                        Logger.ConsoleLog(xtlk.text);
                        dbContext.Assets.RemoveRange(dbContext.Assets.AsNoTracking().Where(m => m.LastUsed <= time));
                        i++;
                        break;
                    }
                    else if (arg.Contains("C"))
                    {
                        xtlk.text = $"Removing All Cached Props, issued by [{sessionState.UserID}] {sessionState.details.name}";
                        SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0);
                        Logger.ConsoleLog(xtlk.text);

                        dbContext.Assets.RemoveRange(dbContext.Assets);
                        break;
                    }

                    if (arg.Contains("L"))
                    {
                        xtlk.text = $"Purging All Loose Props, issued by [{sessionState.UserID}] {sessionState.details.name}";
                        SessionManager.SendToStaff(xtlk, EventTypes.MSG_XTALK, 0);
                        Logger.ConsoleLog(xtlk.text);
                        dbContext.LooseProps.RemoveRange(dbContext.LooseProps);
                        break;
                    }
                }
            }

            dbContext.SaveChanges();

            return(true);
        }
Ejemplo n.º 7
0
        public bool Command(ThePalaceEntities dbContext, UInt32 UserID, UInt32 TargetID, params string[] args)
        {
            var sessionState = UserID != 0xFFFFFFFF ? SessionManager.sessionStates[UserID] : null;
            var xtlk         = new MSG_XTALK();

            if (args.Length < 1)
            {
                xtlk.text = "A parameter is required for this command.";
            }
            else
            {
                foreach (var _arg in args)
                {
                    var arg = _arg.Trim();

                    if (Regex.IsMatch(arg, "^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$"))
                    {
                        var records = dbContext.Bans
                                      .Where(b => b.Ipaddress == arg)
                                      .ToList();

                        if (records.Count > 0)
                        {
                            dbContext.Bans.RemoveRange(records);
                        }
                    }

                    if (Regex.IsMatch(arg, @"^[\{]*[A-Q][\}]*$"))
                    {
                        var seed    = Cipher.WizKeytoSeed(arg);
                        var crc     = Cipher.ComputeLicenseCrc((UInt32)seed);
                        var ctr     = Cipher.GetSeedFromReg((UInt32)seed, crc);
                        var records = dbContext.Bans
                                      .Where(b => b.RegCtr == ctr && b.RegCrc == crc)
                                      .ToList();

                        if (records.Count > 0)
                        {
                            dbContext.Bans.RemoveRange(records);
                        }
                    }

                    if (Regex.IsMatch(arg, @"^[\{]*[Z][A-Q][\}]*$"))
                    {
                        var seed    = Cipher.WizKeytoSeed(arg);
                        var crc     = Cipher.ComputeLicenseCrc((UInt32)seed);
                        var ctr     = Cipher.GetSeedFromPUID((UInt32)seed, crc);
                        var records = dbContext.Bans
                                      .Where(b => b.Puidctr == ctr && b.Puidcrc == crc)
                                      .ToList();

                        if (records.Count > 0)
                        {
                            dbContext.Bans.RemoveRange(records);
                        }
                    }
                }

                if (dbContext.HasUnsavedChanges())
                {
                    dbContext.SaveChanges();

                    xtlk.text = "Ban record(s) removed...";
                }
                else
                {
                    xtlk.text = "Unable to find ban record(s) by that criteria, try again.";
                }
            }

            if (UserID == 0xFFFFFFFF)
            {
                Logger.ConsoleLog(xtlk.text);
            }
            else
            {
                sessionState.Send(xtlk, EventTypes.MSG_XTALK, 0);
            }

            return(true);
        }
Ejemplo n.º 8
0
        public static void AuthorizeUser(ThePalaceEntities dbContext, object message, out int AuthUserID, out List <int> AuthRoleIDs, out List <int> AuthMsgIDs, out List <string> AuthCmds)
        {
            var sessionState = ((Message)message).sessionState;
            var protocol     = ((Message)message).protocol;

            var ipAddress  = sessionState.driver.GetIPAddress();
            var xTalkB     = new Business.MSG_XTALK();
            var xTalkP     = new MSG_XTALK();
            var authUserID = 0;

            var actions = new Dictionary <Type, Action>
            {
                { typeof(MSG_LOGON), () => {
                      var inboundPacket = (MSG_LOGON)protocol;

                      authUserID = dbContext.Auth.AsNoTracking()
                                   .AsEnumerable()
                                   .Where(a =>
                                          ((a.AuthType & (byte)AuthTypes.Password) == 0 || ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == (inboundPacket.reg.wizPassword ?? string.Empty).Trim())) &&
                                          ((a.AuthType & (byte)AuthTypes.IPAddress) == 0 || ((a.AuthType & (byte)AuthTypes.IPAddress) != 0 && a.Value.Trim() == ipAddress)) &&
                                          ((a.AuthType & (byte)AuthTypes.RegCode) == 0 || ((a.AuthType & (byte)AuthTypes.RegCode) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.counter && a.Crc == sessionState.reg.crc)) &&
                                          ((a.AuthType & (byte)AuthTypes.PUID) == 0 || ((a.AuthType & (byte)AuthTypes.PUID) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.puidCtr && a.Crc == sessionState.reg.puidCRC)))
                                   .Select(a => a.UserId)
                                   .FirstOrDefault();

                      if (authUserID > 0)
                      {
                          xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!";

                          Logger.Log(MessageTypes.Info, xTalkP.text);

                          xTalkB.SendToUserID(dbContext, new Message
                            {
                                sessionState = sessionState,
                                protocol     = xTalkP,
                            });

                          xTalkB.SendToStaff(dbContext, new Message
                            {
                                sessionState = sessionState,
                                protocol     = xTalkP,
                            });
                      }
                  } },
                { typeof(MSG_SUPERUSER), () => {
                      var inboundPacket = (MSG_SUPERUSER)protocol;

                      authUserID = dbContext.Auth.AsNoTracking()
                                   .AsEnumerable()
                                   .Where(a =>
                                          ((a.AuthType & (byte)AuthTypes.Password) == 0 || ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == (inboundPacket.password ?? string.Empty).Trim())) &&
                                          ((a.AuthType & (byte)AuthTypes.IPAddress) == 0 || ((a.AuthType & (byte)AuthTypes.IPAddress) != 0 && a.Value.Trim() == ipAddress)) &&
                                          ((a.AuthType & (byte)AuthTypes.RegCode) == 0 || ((a.AuthType & (byte)AuthTypes.RegCode) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.counter && a.Crc == sessionState.reg.crc)) &&
                                          ((a.AuthType & (byte)AuthTypes.PUID) == 0 || ((a.AuthType & (byte)AuthTypes.PUID) != 0 && a.Ctr.HasValue && a.Crc.HasValue && a.Ctr == sessionState.reg.puidCtr && a.Crc == sessionState.reg.puidCRC)))
                                   .Select(a => a.UserId)
                                   .FirstOrDefault();

                      if (authUserID > 0)
                      {
                          xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!";

                          xTalkB.SendToUserID(dbContext, new Message
                            {
                                sessionState = sessionState,
                                protocol     = xTalkP,
                            });
                      }
                      else
                      {
                          xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] attempted authorization and failed...";
                      }

                      Logger.Log(MessageTypes.Info, xTalkP.text);

                      xTalkB.SendToStaff(dbContext, new Message
                        {
                            sessionState = sessionState,
                            protocol     = xTalkP,
                        });
                  } },
                { typeof(MSG_AUTHRESPONSE), () => {
                      var inboundPacket = (MSG_AUTHRESPONSE)protocol;

                      authUserID = dbContext.Auth.AsNoTracking()
                                   .Where(a =>
                                          ((a.AuthType & (byte)AuthTypes.Password) != 0 && a.Value.Trim() == inboundPacket.password.Trim()))
                                   .Join(
                          dbContext.Users.AsNoTracking(),
                          a => a.UserId,
                          u => u.UserId,
                          (a, u) => new { a, u }
                          )
                                   .Where(u => u.u.Name == inboundPacket.userName.Trim())
                                   .Select(a => a.a.UserId)
                                   .FirstOrDefault();

                      if (authUserID > 0)
                      {
                          xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] is now authorized!";

                          xTalkB.SendToUserID(dbContext, new Message
                            {
                                sessionState = sessionState,
                                protocol     = xTalkP,
                            });
                      }
                      else
                      {
                          xTalkP.text = $"{sessionState.details.name} ({sessionState.UserID}) [{ipAddress}] attempted authorization and failed...";
                      }

                      Logger.Log(MessageTypes.Info, xTalkP.text);

                      xTalkB.SendToStaff(dbContext, new Message
                        {
                            sessionState = sessionState,
                            protocol     = xTalkP,
                        });
                  } }
            };

            var type = protocol.GetType();

            if (type != null && actions.ContainsKey(type))
            {
                actions[type]();
            }

            if (authUserID > 0)
            {
                AuthUserID  = authUserID;
                AuthRoleIDs = dbContext.GroupUsers.AsNoTracking()
                              .Where(gu => gu.UserId == authUserID)
                              .Join(
                    dbContext.GroupRoles.AsNoTracking(),
                    gu => gu.GroupId,
                    gr => gr.GroupId,
                    (gu, gr) => new { gu, gr }
                    )
                              .Select(g => g.gr.RoleId)
                              .Distinct()
                              .ToList();
                AuthMsgIDs = new List <int>();
                AuthCmds   = new List <string>();

                sessionState.userFlags |= (short)(UserFlags.U_SuperUser | UserFlags.U_God);

                var now = DateTime.UtcNow;
                var sessionDuration_InMinutes = ConfigManager.GetValue <UInt32>("SessionDuration_InMinutes", 1440).Value;
                var expireDate = now.AddMinutes(sessionDuration_InMinutes);
                var sessionRec = dbContext.Sessions
                                 .Where(s => s.UserId == authUserID)
                                 .SingleOrDefault();

                if (sessionRec == null)
                {
                    sessionRec = new Sessions
                    {
                        UserId    = authUserID,
                        Hash      = Guid.NewGuid(),
                        UntilDate = expireDate,
                        LastUsed  = now,
                    };

                    dbContext.Sessions.Add(sessionRec);
                }
                else if (sessionRec.LastUsed < now)
                {
                    sessionRec.Hash      = Guid.NewGuid();
                    sessionRec.UntilDate = expireDate;
                    sessionRec.LastUsed  = now;
                }
                else
                {
                    sessionRec.LastUsed = now;
                }

                if (dbContext.HasUnsavedChanges())
                {
                    dbContext.SaveChanges();
                }

                if (sessionState.successfullyConnected)
                {
                    var uSta = new MSG_USERSTATUS
                    {
                        flags = sessionState.userFlags,
                        hash  = sessionRec.Hash,
                    };

                    sessionState.Send(uSta, EventTypes.MSG_USERSTATUS, (Int32)sessionState.UserID);
                }
            }
            else
            {
                AuthUserID  = 0;
                AuthRoleIDs = null;
                AuthMsgIDs  = null;
                AuthCmds    = null;
            }
        }