Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Çѱ¹¾î resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#pragma code_page(949)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MENU_POPUP MENU
BEGIN
POPUP "MENU"
BEGIN
POPUP "Console(&C)"
BEGIN
MENUITEM "Open Console(&O)", ID_CONSOL_OPENCONSOLE
MENUITEM "Close Console(&C)", ID_CONSOLE_CLOSECONSOLE
END
MENUITEM SEPARATOR
MENUITEM "Connect All(&A)", ID_CONNECTALL
MENUITEM "Flush(&F)", ID_FLUSH
MENUITEM SEPARATOR
MENUITEM "Shutdown(&E)", ID_QUIT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_TRAY_ICON ICON "AdminToolServer.ico"
#endif // Çѱ¹¾î resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,233 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="AdminToolServer"
ProjectGUID="{21AA2880-D5FC-40D4-82B2-5ECA5579B815}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="./;../../RylServerProject;../../RylServerProject/BaseLibrary;../../RylServerProject/RylServerLibrary;../../RylServerProject/RylGameLibrary;../AdminToolLibrary;"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;NO_GAMEGUARD"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/AdminToolServer.exe"
LinkIncremental="0"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/AdminToolServer.pdb"
GenerateMapFile="TRUE"
MapFileName="$(OutDir)/AdminToolServer.map"
MapExports="TRUE"
MapLines="TRUE"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="../Executable/$(ConfigurationName)"
IntermediateDirectory="../Intermediate/$(ProjectName)/$(ConfigurationName)"
ConfigurationType="1"
UseOfMFC="0"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./;../../RylServerProject;../../RylServerProject/BaseLibrary;../../RylServerProject/RylServerLibrary;../../RylServerProject/RylGameLibrary;../AdminToolLibrary;"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/AdminToolServer.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/AdminToolServer.pdb"
GenerateMapFile="TRUE"
MapFileName="$(OutDir)/AdminToolServer.map"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Network"
Filter="">
<Filter
Name="Dispatch"
Filter="">
<File
RelativePath=".\RYL_AdminMgrDispatch.cpp">
</File>
<File
RelativePath=".\RYL_AdminMgrDispatch.h">
</File>
<File
RelativePath=".\RYL_AgentServerDispatch.cpp">
</File>
<File
RelativePath=".\RYL_AgentServerDispatch.h">
</File>
</Filter>
<Filter
Name="Keeper"
Filter="">
<File
RelativePath=".\RYL_ServerRequestKeeper.cpp">
</File>
<File
RelativePath=".\RYL_ServerRequestKeeper.h">
</File>
</Filter>
</Filter>
<Filter
Name="SessionTable"
Filter="">
<File
RelativePath=".\ClientDispatchTable.cpp">
</File>
<File
RelativePath=".\ClientDispatchTable.h">
</File>
<File
RelativePath=".\RYL_AgentServerTable.cpp">
</File>
<File
RelativePath=".\RYL_AgentServerTable.h">
</File>
</Filter>
<Filter
Name="Resource"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File
RelativePath=".\AdminManagerServer.rc">
</File>
<File
RelativePath=".\AdminToolServer.ico">
</File>
</Filter>
<Filter
Name="SQL Scripts"
Filter="">
<File
RelativePath=".\P2_1480_AdminTool DB_All Create.sql">
</File>
<Filter
Name="Add"
Filter="">
<File
RelativePath=".\P2_1440_Table Add.sql">
</File>
<File
RelativePath=".\P2_1480_AdminToolDB All Edit (AdminInfo Excepted).sql">
</File>
<File
RelativePath=".\P2_1480_Procedure Alter.sql">
</File>
</Filter>
<Filter
Name="Etc"
Filter="">
<File
RelativePath=".\New Admin Account Add.sql">
</File>
</Filter>
</Filter>
<File
RelativePath=".\resource.h">
</File>
<File
RelativePath=".\RYL_AdminManagerServer.cpp">
</File>
<File
RelativePath=".\RYL_AdminManagerServer.h">
</File>
<File
RelativePath=".\RYL_AdminServerCommand.h">
</File>
<File
RelativePath=".\RYL_AdminWindow.cpp">
</File>
<File
RelativePath=".\RYL_AdminWindow.h">
</File>
<File
RelativePath=".\RYL_AdminWinMain.cpp">
</File>
<File
RelativePath=".\stdafx.h">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,53 @@
#include "stdafx.h"
#include "ClientDispatchTable.h"
#include "RYL_AdminMgrDispatch.h"
#include <./Network/Session/Session.h>
#include <Stream/Buffer/Buffer.h>
void CClientDispatchTable::insert(CRylAdminMgrDispatch * lpDispatch)
{
DispatchLock::Syncronize Lock(m_DispatchLock);
m_lstDispatch.push_back(lpDispatch);
}
void CClientDispatchTable::erase(CRylAdminMgrDispatch * lpDispatch)
{
DispatchLock::Syncronize Lock(m_DispatchLock);
lstDispatch::iterator Itr_ =
std::find(m_lstDispatch.begin(), m_lstDispatch.end(), lpDispatch);
if(m_lstDispatch.end() != Itr_)
{
m_lstDispatch.erase(Itr_);
}
}
bool CClientDispatchTable::SendAll(CBuffer * lpBuffer)
{
bool bResult = true;
DispatchLock::Syncronize Lock(m_DispatchLock);
lstDispatch::iterator Itr_ = m_lstDispatch.begin();
lstDispatch::iterator end_ = m_lstDispatch.end();
for(;Itr_ != end_;)
{
CRylAdminMgrDispatch * lpDispatch = (*Itr_);
CSession & Session = lpDispatch->GetSession();
if(!Session.SendPending(lpBuffer))
{
bResult = false;
}
++ Itr_;
}
return bResult;
}

View File

@@ -0,0 +1,36 @@
#ifndef _CLIENT_DISPATCH_TABLE_H_
#define _CLIENT_DISPATCH_TABLE_H_
#include <Thread/Lock.h>
#include <Pattern/Singleton.h>
class CBuffer;
class CRylAdminMgrDispatch;
/*!
\class CClientDispatchTable
운영서버와 연결중인 클라이언트 연결 세션 테이블
*/
class CClientDispatchTable
{
private:
typedef CCSLock DispatchLock ;
typedef std::list<CRylAdminMgrDispatch*> lstDispatch ;
DispatchLock m_DispatchLock;
lstDispatch m_lstDispatch;
public:
static CClientDispatchTable & GetInstance()
{
static CClientDispatchTable DispatchTable;
return DispatchTable;
}
void insert(CRylAdminMgrDispatch * lpDispatch);
void erase(CRylAdminMgrDispatch * lpDispatch);
bool SendAll(CBuffer * lpBuffer);
};
#endif

View File

@@ -0,0 +1,4 @@
-- VALUES 이후의 괄호안의 항목을 편집합니다.
INSERT INTO TblToolAdmin(strAdminID, strPasswd, strLevel, strName, strIP)
VALUES ('zunpyo', '1234', 'D', '임준표', '61.251.229.131')

View File

@@ -0,0 +1,38 @@
CREATE TABLE [dbo].[TblRestraintChar] (
[tinyServerID] [tinyint] NOT NULL ,
[UID] [int] NOT NULL ,
[strClientID] [varchar] (20) NOT NULL ,
[strCharName] [varchar] (20) NOT NULL ,
[tinyType] [tinyint] NOT NULL ,
[tinyKind] [tinyint] NOT NULL ,
[tinyBlocked] [tinyint] NOT NULL ,
[dateStartTime] [smalldatetime] NOT NULL ,
[dateEndTime] [smalldatetime] NOT NULL ,
[intEndTime] [int] NOT NULL ,
[strAdminID] [varchar] (20) NULL ,
[strDescription] [varchar] (30) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg] (
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg_Log] (
[LogID] [int] NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL ,
[InsertTime] [smalldatetime] NOT NULL
) ON [PRIMARY]
GO

View File

@@ -0,0 +1,470 @@
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CMS_DoingRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CMS_DoingRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USPCheckRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[USPCheckRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USPDeleteRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[USPDeleteRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblChatBanList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblChatBanList]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblGMLogMsg]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblGMLogMsg]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblGMLogMsg_Log]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblGMLogMsg_Log]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblInterestedUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblInterestedUser]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblRestraintChar]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblAdminStore]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblAdminStore]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblDetailLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblDetailLog]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblLog]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblToolAdmin]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblToolAdmin]
GO
CREATE TABLE [dbo].[TblChatBanList] (
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NULL ,
[RemainTime] [int] NULL ,
[AdminCID] [int] NULL ,
[StartTime] [smalldatetime] NULL ,
[EndTime] [smalldatetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg] (
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg_Log] (
[LogID] [int] NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL ,
[InsertTime] [smalldatetime] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblInterestedUser] (
[strAccount] [varchar] (20) COLLATE NOT NULL ,
[strReason] [varchar] (260) COLLATE NULL ,
[intUID] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblRestraintChar] (
[tinyServerID] [tinyint] NOT NULL ,
[UID] [int] NOT NULL ,
[strClientID] [varchar] (20) NOT NULL ,
[strCharName] [varchar] (20) NOT NULL ,
[tinyType] [tinyint] NOT NULL ,
[tinyKind] [tinyint] NOT NULL ,
[tinyBlocked] [tinyint] NOT NULL ,
[dateStartTime] [smalldatetime] NOT NULL ,
[dateEndTime] [smalldatetime] NOT NULL ,
[intEndTime] [int] NOT NULL ,
[strAdminID] [varchar] (20) NULL ,
[strDescription] [varchar] (30) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblAdminStore] (
[uid] [int] IDENTITY (1, 1) NOT NULL ,
[server] [tinyint] NOT NULL ,
[owner] [varchar] (20) NOT NULL ,
[ItemName] [varchar] (32) NOT NULL ,
[ItemInfo] [binary] (100) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblDetailLog] (
[DetailLogID] [int] IDENTITY (1, 1) NOT NULL ,
[LogID] [int] NOT NULL ,
[UpdateDate] [smalldatetime] NOT NULL ,
[UpdateType] [int] NULL ,
[Before] [varchar] (200) NULL ,
[After] [varchar] (200) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblLog] (
[UID] [int] NOT NULL ,
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[Login] [smalldatetime] NOT NULL ,
[Logout] [smalldatetime] NULL ,
[UseIP] [varchar] (16) NOT NULL ,
[UseMsg] [varchar] (100) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblToolAdmin] (
[UID] [int] IDENTITY (1, 1) NOT NULL ,
[strAdminID] [varchar] (20) NOT NULL ,
[strPasswd] [varchar] (20) NOT NULL ,
[strLevel] [varchar] (2) NOT NULL ,
[strName] [varchar] (20) NOT NULL ,
[strIP] [varchar] (16) NOT NULL ,
[dateRegit] [smalldatetime] NOT NULL ,
[binZone] [binary] (3400) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg] WITH NOCHECK ADD
CONSTRAINT [PK_TblGMLogMsg] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg_Log] WITH NOCHECK ADD
CONSTRAINT [PK_TblGMLogMsg_Log] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblDetailLog] WITH NOCHECK ADD
CONSTRAINT [PK_TblDetailLog] PRIMARY KEY CLUSTERED
(
[DetailLogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblLog] WITH NOCHECK ADD
CONSTRAINT [PK_TblLog] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblToolAdmin] WITH NOCHECK ADD
CONSTRAINT [PK_TblToolAdmin] PRIMARY KEY CLUSTERED
(
[strAdminID]
) ON [PRIMARY]
GO
CREATE INDEX [idx_TblChatBanList_cid] ON [dbo].[TblChatBanList]([CID]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg] ADD
CONSTRAINT [DF_TblGMLogMsg_UID] DEFAULT (0) FOR [UID],
CONSTRAINT [DF_TblGMLogMsg_CID] DEFAULT (0) FOR [CID],
CONSTRAINT [DF_TblGMLogMsg_EditDate] DEFAULT (getdate()) FOR [EditDate]
GO
ALTER TABLE [dbo].[TblGMLogMsg_Log] ADD
CONSTRAINT [DF_TblGMLogMsg_Log_UID] DEFAULT (0) FOR [UID],
CONSTRAINT [DF_TblGMLogMsg_Log_CID] DEFAULT (0) FOR [CID],
CONSTRAINT [DF_TblGMLogMsg_Log_EditDate] DEFAULT (getdate()) FOR [EditDate],
CONSTRAINT [DF_TblGMLogMsg_Log_InsertTime] DEFAULT (getdate()) FOR [InsertTime]
GO
ALTER TABLE [dbo].[TblRestraintChar] ADD
CONSTRAINT [DF__TblRestra__strCh__11158940] DEFAULT ('ACCOUNT') FOR [strCharName],
CONSTRAINT [DF__TblRestra__dateS__1209AD79] DEFAULT (getdate()) FOR [dateStartTime],
CONSTRAINT [DF__TblRestra__intEn__12FDD1B2] DEFAULT (0) FOR [intEndTime]
GO
ALTER TABLE [dbo].[TblDetailLog] ADD
CONSTRAINT [DF_TblDetailLog_UpdateDate] DEFAULT (getdate()) FOR [UpdateDate]
GO
ALTER TABLE [dbo].[TblLog] ADD
CONSTRAINT [DF_TblLog_Login] DEFAULT (getdate()) FOR [Login]
GO
ALTER TABLE [dbo].[TblToolAdmin] ADD
CONSTRAINT [DF_TblToolAdmin_dateRegit] DEFAULT (getdate()) FOR [dateRegit]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- 블럭 하기
CREATE PROC CMS_DoingRestraintChar @ServerID TINYINT,@UID INT, @strClientID VARCHAR(20), @strCharName varchar(16),@Type tinyint,@Kind tinyint,@EndDate varchar(10),
@AdminID VARCHAR(20),@Description VARCHAR(50)
AS
SET NOCOUNT ON
DECLARE @EndDateTime INT
IF @strCharName IS NULL
BEGIN
SET @strCharName = 'Unknown'
END
SET @EndDateTime = cast(@EndDate as INT)
INSERT INTO TblRestraintChar (tinyServerID,UID,strClientID,strCharName,tinyType,tinyKind,tinyBlocked,dateEndTime,strAdminID,strDescription)
VALUES (@ServerID,@UID,@strClientid,@strCharName,@Type,@Kind,1,GETDATE() + @EndDateTime,@AdminID,@Description)
SELECT @@ROWCOUNT
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- 블럭 체크
CREATE Proc USPCheckRestraintChar @ServerID Tinyint,@UID INT
AS
SET NOCOUNT ON
DECLARE @tinyType TINYINT
SET @tinyType = 0
DECLARE @tinyKind TINYINT -- 1:영구,0:임시
DECLARE @EndTime INT
DECLARE @dateEndTime SMALLDATETIME
DECLARE @intEndTime INT
DECLARE @RETURNCHAR1 VARCHAR(20)
DECLARE @RETURNCHAR2 VARCHAR(20)
DECLARE @RETURNCHAR3 VARCHAR(20)
DECLARE @RETURNCHAR4 VARCHAR(20)
DECLARE @RETURNCHAR5 VARCHAR(20)
DECLARE @strCharName VARCHAR(20)
DECLARE @TIME INT
SELECT @tinyType=tinyType,@tinyKind = tinykind,@EndTime =DATEDIFF(MINUTE,GETDATE(),dateEndTime)
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
ORDER BY tinyType
IF @tinyType = 0 -- 블럭안함
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
ELSE IF @tinyType = 1 -- 계정블럭
BEGIN
-- 기간여부체크
IF (@EndTime <= 0 and @tinyKind = 0) --
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
SET @tinyType = 0
SELECT @tinyType=tinyType,@tinyKind = tinykind,@EndTime =DATEDIFF(MINUTE,GETDATE(),dateEndTime)
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
ORDER BY tinyType
IF @tinyType = 2 --
BEGIN
SET @strCharName = NULL
SET @EndTime = 0
SET @TIME = 1
DECLARE Restraint_Cursor_A CURSOR FOR
SELECT strCharName,DATEDIFF(MINUTE,GETDATE(),dateEndTime),tinyKind
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
OPEN Restraint_Cursor_A FETCH NEXT FROM Restraint_Cursor_A INTO @strCharName,@EndTime,@tinyKind
WHILE @@FETCH_STATUS = 0
BEGIN
IF ((@EndTime > 0) or (@tinyKind = 1))
BEGIN
IF @TIME = 1
SET @RETURNCHAR1 = @strCharName
ELSE IF @TIME = 2
SET @RETURNCHAR2 = @strCharName
ELSE IF @TIME = 3
SET @RETURNCHAR3 = @strCharName
ELSE IF @TIME = 4
SET @RETURNCHAR4 = @strCharName
ELSE IF @TIME = 5
SET @RETURNCHAR5 = @strCharName
END
ELSE
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND strCharName = @strCharName AND tinyBlocked = 1
END
SET @TIME = @TIME + 1
FETCH NEXT FROM Restraint_Cursor_A into @strCharName,@EndTime,@tinyKind
END
CLOSE Restraint_Cursor_A
DEALLOCATE Restraint_Cursor_A
IF ((@RETURNCHAR1 IS NULL) AND (@RETURNCHAR2 IS NULL) AND (@RETURNCHAR3 IS NULL) and (@RETURNCHAR4 IS NULL) and (@RETURNCHAR5 IS NULL))
BEGIN
SET @tinyType = 0
END
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
SET @tinyType = 0
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
ELSE
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
END
ELSE IF @tinyType = 2 --
BEGIN
SET @strCharName = NULL
SET @EndTime = 0
SET @TIME = 1
DECLARE Restraint_Cursor CURSOR FOR
SELECT strCharName,DATEDIFF(MINUTE,GETDATE(),dateEndTime),tinyKind
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
OPEN Restraint_Cursor FETCH NEXT FROM Restraint_Cursor INTO @strCharName,@EndTime,@tinyKind
WHILE @@FETCH_STATUS = 0
BEGIN
IF ((@EndTime > 0) or (@tinyKind = 1))
BEGIN
IF @TIME = 1
SET @RETURNCHAR1 = @strCharName
ELSE IF @TIME = 2
SET @RETURNCHAR2 = @strCharName
ELSE IF @TIME = 3
SET @RETURNCHAR3 = @strCharName
ELSE IF @TIME = 4
SET @RETURNCHAR4 = @strCharName
ELSE IF @TIME = 5
SET @RETURNCHAR5 = @strCharName
END
ELSE
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND strCharName = @strCharName AND tinyBlocked = 1
END
SET @TIME = @TIME + 1
FETCH NEXT FROM Restraint_Cursor into @strCharName,@EndTime,@tinyKind
END
CLOSE Restraint_Cursor
DEALLOCATE Restraint_Cursor
IF ((@RETURNCHAR1 IS NULL) AND (@RETURNCHAR2 IS NULL) AND (@RETURNCHAR3 IS NULL) and (@RETURNCHAR4 IS NULL) and (@RETURNCHAR5 IS NULL))
BEGIN
SET @tinyType = 0
END
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROC USPDeleteRestraintChar @SeverID tinyint,@UID INT,@Charname varchar(16)
AS
SET NOCOUNT ON
IF EXISTS (SELECT UID FROM TblRestraintChar WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname)
BEGIN
DELETE TblRestraintChar
WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname
SELECT @@ROWCOUNT
END
ELSE
BEGIN
SELECT 0
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

View File

@@ -0,0 +1,433 @@
-- 해외쪽 운영DB 버전 관리가 지금까지 제대로 되지 않아 운영계정을 제외하곤 최신으로 모두 수정!
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CMS_DoingRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[CMS_DoingRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USPCheckRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[USPCheckRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USPDeleteRestraintChar]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[USPDeleteRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblChatBanList]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblChatBanList]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblGMLogMsg]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblGMLogMsg]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblGMLogMsg_Log]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblGMLogMsg_Log]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblInterestedUser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblInterestedUser]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblRestraintChar]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblRestraintChar]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblDetailLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblDetailLog]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TblLog]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TblLog]
GO
CREATE TABLE [dbo].[TblChatBanList] (
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NULL ,
[RemainTime] [int] NULL ,
[AdminCID] [int] NULL ,
[StartTime] [smalldatetime] NULL ,
[EndTime] [smalldatetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg] (
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblGMLogMsg_Log] (
[LogID] [int] NOT NULL ,
[UID] [int] NULL ,
[CID] [int] NULL ,
[ServerGroupID] [tinyint] NOT NULL ,
[EditDate] [smalldatetime] NOT NULL ,
[LogMsg] [varchar] (200) NULL ,
[AdminID] [varchar] (20) NOT NULL ,
[InsertTime] [smalldatetime] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblInterestedUser] (
[strAccount] [varchar] (20) NOT NULL ,
[strReason] [varchar] (260) NULL ,
[intUID] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblRestraintChar] (
[tinyServerID] [tinyint] NOT NULL ,
[UID] [int] NOT NULL ,
[strClientID] [varchar] (20) NOT NULL ,
[strCharName] [varchar] (20) NOT NULL ,
[tinyType] [tinyint] NOT NULL ,
[tinyKind] [tinyint] NOT NULL ,
[tinyBlocked] [tinyint] NOT NULL ,
[dateStartTime] [smalldatetime] NOT NULL ,
[dateEndTime] [smalldatetime] NOT NULL ,
[intEndTime] [int] NOT NULL ,
[strAdminID] [varchar] (20) NULL ,
[strDescription] [varchar] (30) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblDetailLog] (
[DetailLogID] [int] IDENTITY (1, 1) NOT NULL ,
[LogID] [int] NOT NULL ,
[UpdateDate] [smalldatetime] NOT NULL ,
[UpdateType] [int] NULL ,
[Before] [varchar] (200) NULL ,
[After] [varchar] (200) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblLog] (
[UID] [int] NOT NULL ,
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[Login] [smalldatetime] NOT NULL ,
[Logout] [smalldatetime] NULL ,
[UseIP] [varchar] (16) NOT NULL ,
[UseMsg] [varchar] (100) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg] WITH NOCHECK ADD
CONSTRAINT [PK_TblGMLogMsg] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg_Log] WITH NOCHECK ADD
CONSTRAINT [PK_TblGMLogMsg_Log] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblDetailLog] WITH NOCHECK ADD
CONSTRAINT [PK_TblDetailLog] PRIMARY KEY CLUSTERED
(
[DetailLogID]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblLog] WITH NOCHECK ADD
CONSTRAINT [PK_TblLog] PRIMARY KEY CLUSTERED
(
[LogID]
) ON [PRIMARY]
GO
CREATE INDEX [idx_TblChatBanList_cid] ON [dbo].[TblChatBanList]([CID]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TblGMLogMsg] ADD
CONSTRAINT [DF_TblGMLogMsg_UID] DEFAULT (0) FOR [UID],
CONSTRAINT [DF_TblGMLogMsg_CID] DEFAULT (0) FOR [CID],
CONSTRAINT [DF_TblGMLogMsg_EditDate] DEFAULT (getdate()) FOR [EditDate]
GO
ALTER TABLE [dbo].[TblGMLogMsg_Log] ADD
CONSTRAINT [DF_TblGMLogMsg_Log_UID] DEFAULT (0) FOR [UID],
CONSTRAINT [DF_TblGMLogMsg_Log_CID] DEFAULT (0) FOR [CID],
CONSTRAINT [DF_TblGMLogMsg_Log_EditDate] DEFAULT (getdate()) FOR [EditDate],
CONSTRAINT [DF_TblGMLogMsg_Log_InsertTime] DEFAULT (getdate()) FOR [InsertTime]
GO
ALTER TABLE [dbo].[TblRestraintChar] ADD
CONSTRAINT [DF__TblRestra__strCh__11158940] DEFAULT ('ACCOUNT') FOR [strCharName],
CONSTRAINT [DF__TblRestra__dateS__1209AD79] DEFAULT (getdate()) FOR [dateStartTime],
CONSTRAINT [DF__TblRestra__intEn__12FDD1B2] DEFAULT (0) FOR [intEndTime]
GO
ALTER TABLE [dbo].[TblDetailLog] ADD
CONSTRAINT [DF_TblDetailLog_UpdateDate] DEFAULT (getdate()) FOR [UpdateDate]
GO
ALTER TABLE [dbo].[TblLog] ADD
CONSTRAINT [DF_TblLog_Login] DEFAULT (getdate()) FOR [Login]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- 블럭 하기
CREATE PROC CMS_DoingRestraintChar @ServerID TINYINT,@UID INT, @strClientID VARCHAR(20), @strCharName varchar(16),@Type tinyint,@Kind tinyint,@EndDate varchar(10),
@AdminID VARCHAR(20),@Description VARCHAR(50)
AS
SET NOCOUNT ON
DECLARE @EndDateTime INT
IF @strCharName IS NULL
BEGIN
SET @strCharName = 'Unknown'
END
SET @EndDateTime = cast(@EndDate as INT)
INSERT INTO TblRestraintChar (tinyServerID,UID,strClientID,strCharName,tinyType,tinyKind,tinyBlocked,dateEndTime,strAdminID,strDescription)
VALUES (@ServerID,@UID,@strClientid,@strCharName,@Type,@Kind,1,GETDATE() + @EndDateTime,@AdminID,@Description)
SELECT @@ROWCOUNT
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- 블럭 체크
CREATE Proc USPCheckRestraintChar @ServerID Tinyint,@UID INT
AS
SET NOCOUNT ON
DECLARE @tinyType TINYINT
SET @tinyType = 0
DECLARE @tinyKind TINYINT -- 1:영구,0:임시
DECLARE @EndTime INT
DECLARE @dateEndTime SMALLDATETIME
DECLARE @intEndTime INT
DECLARE @RETURNCHAR1 VARCHAR(20)
DECLARE @RETURNCHAR2 VARCHAR(20)
DECLARE @RETURNCHAR3 VARCHAR(20)
DECLARE @RETURNCHAR4 VARCHAR(20)
DECLARE @RETURNCHAR5 VARCHAR(20)
DECLARE @strCharName VARCHAR(20)
DECLARE @TIME INT
SELECT @tinyType=tinyType,@tinyKind = tinykind,@EndTime =DATEDIFF(MINUTE,GETDATE(),dateEndTime)
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
ORDER BY tinyType
IF @tinyType = 0 -- 블럭안함
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
ELSE IF @tinyType = 1 -- 계정블럭
BEGIN
-- 기간여부체크
IF (@EndTime <= 0 and @tinyKind = 0) --
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
SET @tinyType = 0
SELECT @tinyType=tinyType,@tinyKind = tinykind,@EndTime =DATEDIFF(MINUTE,GETDATE(),dateEndTime)
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
ORDER BY tinyType
IF @tinyType = 2 --
BEGIN
SET @strCharName = NULL
SET @EndTime = 0
SET @TIME = 1
DECLARE Restraint_Cursor_A CURSOR FOR
SELECT strCharName,DATEDIFF(MINUTE,GETDATE(),dateEndTime),tinyKind
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
OPEN Restraint_Cursor_A FETCH NEXT FROM Restraint_Cursor_A INTO @strCharName,@EndTime,@tinyKind
WHILE @@FETCH_STATUS = 0
BEGIN
IF ((@EndTime > 0) or (@tinyKind = 1))
BEGIN
IF @TIME = 1
SET @RETURNCHAR1 = @strCharName
ELSE IF @TIME = 2
SET @RETURNCHAR2 = @strCharName
ELSE IF @TIME = 3
SET @RETURNCHAR3 = @strCharName
ELSE IF @TIME = 4
SET @RETURNCHAR4 = @strCharName
ELSE IF @TIME = 5
SET @RETURNCHAR5 = @strCharName
END
ELSE
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND strCharName = @strCharName AND tinyBlocked = 1
END
SET @TIME = @TIME + 1
FETCH NEXT FROM Restraint_Cursor_A into @strCharName,@EndTime,@tinyKind
END
CLOSE Restraint_Cursor_A
DEALLOCATE Restraint_Cursor_A
IF ((@RETURNCHAR1 IS NULL) AND (@RETURNCHAR2 IS NULL) AND (@RETURNCHAR3 IS NULL) and (@RETURNCHAR4 IS NULL) and (@RETURNCHAR5 IS NULL))
BEGIN
SET @tinyType = 0
END
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
SET @tinyType = 0
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
ELSE
BEGIN
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
END
ELSE IF @tinyType = 2 --
BEGIN
SET @strCharName = NULL
SET @EndTime = 0
SET @TIME = 1
DECLARE Restraint_Cursor CURSOR FOR
SELECT strCharName,DATEDIFF(MINUTE,GETDATE(),dateEndTime),tinyKind
FROM TblRestraintChar
WHERE tinyServerID=@ServerID AND UID = @UID AND tinyBlocked = 1
OPEN Restraint_Cursor FETCH NEXT FROM Restraint_Cursor INTO @strCharName,@EndTime,@tinyKind
WHILE @@FETCH_STATUS = 0
BEGIN
IF ((@EndTime > 0) or (@tinyKind = 1))
BEGIN
IF @TIME = 1
SET @RETURNCHAR1 = @strCharName
ELSE IF @TIME = 2
SET @RETURNCHAR2 = @strCharName
ELSE IF @TIME = 3
SET @RETURNCHAR3 = @strCharName
ELSE IF @TIME = 4
SET @RETURNCHAR4 = @strCharName
ELSE IF @TIME = 5
SET @RETURNCHAR5 = @strCharName
END
ELSE
BEGIN
UPDATE TblRestraintChar
SET tinyBlocked = 0
WHERE tinyServerID=@ServerID AND UID = @UID AND strCharName = @strCharName AND tinyBlocked = 1
END
SET @TIME = @TIME + 1
FETCH NEXT FROM Restraint_Cursor into @strCharName,@EndTime,@tinyKind
END
CLOSE Restraint_Cursor
DEALLOCATE Restraint_Cursor
IF ((@RETURNCHAR1 IS NULL) AND (@RETURNCHAR2 IS NULL) AND (@RETURNCHAR3 IS NULL) and (@RETURNCHAR4 IS NULL) and (@RETURNCHAR5 IS NULL))
BEGIN
SET @tinyType = 0
END
SELECT @tinyType,@RETURNCHAR1,@RETURNCHAR2,@RETURNCHAR3,@RETURNCHAR4,@RETURNCHAR5
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROC USPDeleteRestraintChar @SeverID tinyint,@UID INT,@Charname varchar(16)
AS
SET NOCOUNT ON
IF EXISTS (SELECT UID FROM TblRestraintChar WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname)
BEGIN
DELETE TblRestraintChar
WHERE tinyServerID=@SeverID AND UID = @UID AND strCharName = @Charname
SELECT @@ROWCOUNT
END
ELSE
BEGIN
SELECT 0
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

View File

@@ -0,0 +1,34 @@
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- ºí·° Çϱâ
ALTER PROC CMS_DoingRestraintChar @ServerID TINYINT,@UID INT, @strClientID VARCHAR(20), @strCharName varchar(16),@Type tinyint,@Kind tinyint,@EndDate varchar(10),
@AdminID VARCHAR(20),@Description VARCHAR(50)
AS
SET NOCOUNT ON
DECLARE @EndDateTime INT
IF @strCharName IS NULL
BEGIN
SET @strCharName = 'Unknown'
END
SET @EndDateTime = cast(@EndDate as INT)
INSERT INTO TblRestraintChar (tinyServerID,UID,strClientID,strCharName,tinyType,tinyKind,tinyBlocked,dateEndTime,strAdminID,strDescription)
VALUES (@ServerID,@UID,@strClientid,@strCharName,@Type,@Kind,1,GETDATE() + @EndDateTime,@AdminID,@Description)
SELECT @@ROWCOUNT
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

View File

@@ -0,0 +1,311 @@
#include "stdafx.h"
#include "RYL_AdminManagerServer.h"
#include "RYL_AdminWindow.h"
#include "RYL_AdminMgrDispatch.h"
#include "RYL_AgentServerTable.h"
#include <Network/IOCP/IOCPNet.h>
#include <Network/Session/CreatePolicy.h>
#include <Network/Protocol/RYL_AdminMgrProtocol.h>
#include <DBComponent/RYL_AdminMgrDB.h>
#include <DBComponent/BillingDB.h>
#include <DBComponent/AuthDB.h>
#include <Utility/Time/Pulse/Pulse.h>
#include <Utility/Setup/ServerSetup.h>
#include <Item/ItemMgr.h>
#include <Skill/SkillMgr.h>
#include <Quest/QuestMgr.h>
#include <Log/ServerLog.h>
#include <Parser/ServerInfo.h>
#include <mmsystem.h>
#include "RYL_AdminServerCommand.h"
CRylAdminManagerServer CRylAdminManagerServer::ms_this;
unsigned char PktAdminMgr::AuthorityMask::AdminAuthority[PktAdminMgr::PktCMD::PktEnd];
// ServerFramework Process 상속.. ( Thread )
class CAdminToolProcessThread : public CProcessThread
{
public:
enum Const
{
PROCESS_TPP = 100, // 200ms(0.2초) 에 1틱.
CONNECT_CHECK = 10, // 10틱 - 3초마다 연결 체크
INTERESTED_USER_CHK = 10 // 3초마다 관심유저 접속 체크
};
CAdminToolProcessThread(CRylAdminManagerServer& AdminServer)
: CProcessThread(AdminServer, PROCESS_TPP)
, m_AdminServer(AdminServer)
{
}
~CAdminToolProcessThread()
{
}
private:
virtual void Cleanup(CPulse& Pulse)
{
}
virtual void InternalRun(CPulse& Pulse)
{
unsigned long dwCurrentPulse = Pulse.GetCurrentPulse();
if(0 == (dwCurrentPulse % CONNECT_CHECK))
{
m_AdminServer.PrintServerInfo();
//CRylAdminManagerServer.PrintStatistics();
}
// 10초에 한번 테스트
if(Pulse.ProcessBySecond(10))
{
if((CAgentServerTable::GetInstance().GetBillingDB() && CAgentServerTable::GetInstance().GetBillingDB()->GetQueryErrorCount() >= 1) ||
(CAgentServerTable::GetInstance().GetAuthDB() && CAgentServerTable::GetInstance().GetAuthDB()->GetQueryErrorCount() >= 1) )
{
CAgentServerTable::GetInstance().InitAgentServerTable(*m_AdminServer.GetIOCPNet());
}
// DB테스트
// edith 2009.10.1 DB 자동 커넥트 추가기능
// 10초에 한번씩 네트워크 오류를 검사한다.
// 쿼리 에러가 연속으로 10번이상 일어나면 DB에 먼가 문제가 있다.
if(CDBAdminTool::GetInstance().GetQueryErrorCount() >= 1)
{
// DB에 새로 커넥트를 시도한다.
CDBAdminTool::GetInstance().ConnectAdminToolDB();
}
}
}
CRylAdminManagerServer& m_AdminServer;
};
CRylAdminManagerServer& CRylAdminManagerServer::GetInstance()
{
static CRylAdminManagerServer ServerInstance;
return ServerInstance;
}
CRylAdminManagerServer::CRylAdminManagerServer()
: m_bInitializedClientListener(FALSE)
, m_lpClientSessionPolicy(SessionPolicy::CreateTCPPolicy<CRylAdminMgrDispatch >())
{
}
CRylAdminManagerServer::~CRylAdminManagerServer()
{
if(0 != m_lpClientSessionPolicy)
{
m_lpClientSessionPolicy->Release();
m_lpClientSessionPolicy = 0;
}
}
bool CRylAdminManagerServer::ApplicationSpecificInit(const TCHAR* szCmdLine)
{
const int MAX_BUFFER = 255;
CServerInfo& InfoScript = CServerInfo::GetInstance();
// 서버 커맨드 실행
if(!InitializeCommand())
{
ERRLOG0(g_Log, "Command lnit failed");
return false;
}
// 서버 스크립트 파일 로드
if(!InfoScript.Reload())
{
ERRLOG0(g_Log, "ServerInfo file load failed");
return false;
}
// 아이템 스크립트 파일 로드
if(!Item::CItemMgr::GetInstance().LoadItemProtoType("./Script/Game/ItemScript.txt"))
{
ERRLOG0(g_Log, "ItemScript load failed");
return false;
}
// 스킬 스크립트 로드
if(!CSkillMgr::GetInstance().LoadSkillsFromFile())
{
ERRLOG0(g_Log, "SkillScript load failed");
return false;
}
// 퀘스트 매니터 초기화
if(!CQuestMgr::GetInstance().LoadQuestInfo())
{
ERRLOG0(g_Log, "QuestScript load failed");
return false;
}
// 사용자 정의 윈도우 메세지 등록
if(!InitializeMsgProc())
{
ERRLOG0(g_Log, "Window message registing failed");
}
// AdminToolDB 접속
if(!CDBAdminTool::GetInstance().ConnectAdminToolDB())
{
ERRLOG0(g_Log, "Connecting failed: AdminTool DB");
return false;
}
// Listener 생성
if(!GetIOCPNet()->AddListener(m_lpClientSessionPolicy, 0, CServerSetup::P2AdminToolServerClientListen))
{
ERRLOG0(g_Log, "Add listener failed");
return false;
}
// CAdminToolProcessThread 시작및 Thread관리자에 등록...
if(!AddProcessThread(new CAdminToolProcessThread(*this)))
{
ERRLOG0(g_Log, "Add process thread failed");
return false;
}
// 패킷 권한 설정
InitializeAuthority();
// 중계서버 테이블 초기화 (과금 디비도 포함된 테이블)
CAgentServerTable::GetInstance().InitAgentServerTable(*GetIOCPNet());
return true;
}
void CRylAdminManagerServer::InitializeAuthority()
{
using namespace PktAdminMgr;
// 권한 없음
AuthorityMask::AdminAuthority[PktCMD::PktLogin] = AuthorityMask::QUEST_MODE;
AuthorityMask::AdminAuthority[PktCMD::PktLogUseMessage] = AuthorityMask::FREE_MODE;
AuthorityMask::AdminAuthority[PktCMD::PktSetZoneList] = AuthorityMask::FREE_MODE;
AuthorityMask::AdminAuthority[PktCMD::PktCloseCharacter] = AuthorityMask::FREE_MODE;
// 개발자
AuthorityMask::AdminAuthority[PktCMD::PktItemDistribute] = AuthorityMask::DEVELOPER;
// 마스터
AuthorityMask::AdminAuthority[PktCMD::PktNewAdmin] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER; // MASTER 권한 계정 생성은 DEVELOPER 만 가능
AuthorityMask::AdminAuthority[PktCMD::PktAdminList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktDelAdmin] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktUpdateLevel] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktUpdateIP] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktUpdatePasswd] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktGameAdmin] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktLogList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktDetailLog] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktBeforeAfter] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
AuthorityMask::AdminAuthority[PktCMD::PktItemQtyControl] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER;
// 게임 마스터
AuthorityMask::AdminAuthority[PktCMD::PktCheckName] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktChangeName] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktDelCharList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktCharRestore] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktUpdateStatus] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktCreateItem] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktUpdateItem] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktRemoveItem] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktItemReset] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktInvenGold] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktSkillEdit] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktDepositPasswd] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktAdminStoreInsert] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktAdminStoreDelete] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktGetAdminStoreItem] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktUpdateAdminStore] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktDelCharacter] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktStoreGoldUpdate] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktDuplicatedItem] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktCancelExecuteQuest] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktDeleteHistoryQuest] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktGMLogMsg] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
AuthorityMask::AdminAuthority[PktCMD::PktGuildMemberEdit] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM;
// 서포터
AuthorityMask::AdminAuthority[PktCMD::PktSearchBlock] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktAddBlockUser] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktDelBlockUser] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktSearchID] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktSearchName] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktSetCharacter] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktGetCharacter] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktForcedDis] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktUserBillingLog] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktGuildSearch] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktGuildRight] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktRequestGuildMemberList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktGuildRestoreDataList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktFortSearch] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktMiningCamp] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktShopCamp] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktShopCampGold] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktShopCampTax] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktCastleSearch] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktCastleCreature] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktChangePos] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktConnectAllServerz] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktRefreshConnectedList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktInterestedUser] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktConnectionChk] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktConnectedUserList] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktUnifiedCharInfo] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktUnifiedGuildInfo] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktDetailCharInfo] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktUserNation] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktShiftToUID] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktStoreTabEdit] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktAmountOfGold] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktNameChangeCount] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
AuthorityMask::AdminAuthority[PktCMD::PktGetCharInfoTime] |= AuthorityMask::DEVELOPER | AuthorityMask::MASTER | AuthorityMask::GM | AuthorityMask::SUPPORTER;
}
void CRylAdminManagerServer::PrintServerInfo()
{
char szServInfo[4096];
CAgentServerTable& ServerTable = CAgentServerTable::GetInstance();
ServerTable.PrintServerState(szServInfo, sizeof(szServInfo));
PrintInfo(szServInfo, sizeof(szServInfo));
}
bool CRylAdminManagerServer::InitializeCommand()
{
CConsoleCMDFactory& CMDFactory = *GetCommandFactory();
if(!CMDFactory.AddCommand("flush", new CCMDFlush))
{
ERRLOG0(g_Log, "Command failed : flush");
return false;
}
if(!CMDFactory.AddCommand("connect_all", new CCMDConnectAll))
{
ERRLOG0(g_Log, "Command failed : connect_all");
return false;
}
if(!CMDFactory.AddCommand("reload_script", new CCMDReload))
{
ERRLOG0(g_Log, "Command failed : reload");
return false;
}
if(!CMDFactory.AddCommand("connect_index", new CCMDConnect))
{
ERRLOG0(g_Log, "Command failed : connect");
return false;
}
return true;
}

View File

@@ -0,0 +1,41 @@
#ifndef _RYL_ADMIN_MANAGER_SERVER_
#define _RYL_ADMIN_MANAGER_SERVER_
#include < BaseLibrary/Pattern/Singleton.h >
#include < RylServerLibrary/Utility/ServerAppFramework/ServerWindowFramework.h >
class CSessionPolicy;
/*!
\class CRylAdminManagerServer
관리툴 서버 클래스
*/
class CRylAdminManagerServer : public CServerWindowFramework
{
public:
//!Singletone 객체 리턴
static CRylAdminManagerServer& GetInstance();
//!서버상태 Console창에 표시*/
void PrintServerInfo();
//!서버 초기화작업
virtual bool ApplicationSpecificInit(const TCHAR* szCmdLine);
private:
CRylAdminManagerServer();
~CRylAdminManagerServer();
//!패킷 권한 초기화
void InitializeAuthority();
//!윈도우 메세지 초기화
bool InitializeMsgProc();
bool InitializeCommand();
CSessionPolicy* m_lpClientSessionPolicy;
BOOL m_bInitializedClientListener;
//!Singletone 객체
static CRylAdminManagerServer ms_this;
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,181 @@
#ifndef _RYL_ADMIN_MGR_DISPATCH_H_
#define _RYL_ADMIN_MGR_DISPATCH_H_
#include <DBComponent/RYL_DetailLog.h>
#include <Network/Dispatch/RylServerDispatch.h>
#include <Stream/Buffer/BufferFactory.h>
namespace PktAdminMgr
{
struct PktCreateItem;
struct PktUpdateItem;
struct PktRemoveItem;
struct PktItemReset;
};
namespace ItemData
{
class CDepositLock;
};
/*!
\class CRylAdminMgrDispatch
운영 클라이언트로부터 받은 패킷 처리
*/
class CRylAdminMgrDispatch : public CRylServerDispatch
{
public:
CRylAdminMgrDispatch(CSession& Session);
virtual void Destroy(void); // 객체 파괴 이벤트
virtual void Disconnected(void); // 접속 끊김 이벤트
virtual void Connected(void);
bool SendResult(unsigned char cResult); // 결과 패킷 보내기
bool SendResultnRequestKey(unsigned char cResult, unsigned long dwRequestKey); // 결과 패킷과 리퀘스트 키 보내기
private:
virtual bool DispatchPacket(PktBase* lpPktBase); // 받은 패킷 처리
bool PktAuthority(); // 사용 권한 없음 알리기
bool PktUnkonwnPacket(); // 알 수 없는 패킷을 받았을 경우 처리
// 운영 계정 관리
bool PktLogin (PktBase* lpPktBase); // 운영자 로그인
bool PktNewAdmin (PktBase* lpPktBase); // 새 운영 계정 생성
bool PktAdminList (PktBase* lpPktBase=0); // 등록된 운영 계정 리스트 요청
bool PktDelAdmin (PktBase* lpPktBase); // 운영 계정 삭제
bool PktUpdateLev (PktBase* lpPktBase); // 운영 계정LV 변경
bool PktUpdateIP (PktBase* lpPktBase); // 운영 계정 접속 제한 IP변경
bool PktUpdatePasswd (PktBase* lpPktBase); // 운영계정 패스 변경
bool PktLogList (PktBase* lpPktBase); // 툴 사용내역 요청
bool PktDetailLog (PktBase* lpPktBase); // 상세 사용내역 요청
bool PktBeforAfter (PktBase* lpPktBase); // 수정전후 내역 요청
bool PktLogUseMessage (PktBase* lpPktBase); // 툴 사용내역 기록
// 캐릭터 정보 수정
bool PktSearchID (PktBase* lpPktBase); // 캐릭터 검색 (UID, CID)
bool PktSearchName (PktBase* lpPktBase); // 캐릭터 검색 (계정명, 캐릭명)
bool PktCloseCharacter (PktBase* lpPktBase); // 캐릭 수정 독점권 해제
bool PktUpdateStatus (PktBase* lpPktBase); // 캐릭터 스테이터스 수정
bool PktCreateItem (PktBase* lpPktBase); // 아이템 생성
bool PktUpdateItem (PktBase* lpPktBase); // 아이템 수정
bool PktRemoveItem (PktBase* lpPktBase); // 아이템 삭제
bool PktItemReset (PktBase* lpPktBase); // 각종 아이템 컨테이너 초기화
bool PktSkillEdit (PktBase* lpPktBase); // 스킬 관련 (수정, 추가, 삭제)
bool PktChangePos (PktBase* lpPktBase); // 캐릭터 위치 정보 수정
bool PktDepositPasswd (PktBase* lpPktBase); // 창고 패스워드 변경
bool PktChangeName (PktBase* lpPktBase); // 캐릭명 변경
bool PktSetGold (PktBase* lpPktBase); // 인벤토리 골드 수정
bool PktInvenGold (PktBase* lpPktBase); // 인벤토리 골드 수정 2
bool PktStoreGoldUpdate (PktBase* lpPktBase); // 창고 골드 수정
bool PktCancelExecuteQuest (PktBase* lpPktBase); // 수행 중인 퀘스트 취소
bool PktDeleteHistoryQuest (PktBase* lpPktBase); // 완료한 퀘스트 목록에서 제거
bool PktUserNation (PktBase* lpPktBase); // 계정의 국적 얻기
bool PktStoreTabEdit (PktBase* lpPktBase); // 창고 탭 수정
bool PktNameChangeCount (PktBase* lpPktBase); // 캐릭명 변경 기회 수정
bool PktGetCharacter (PktBase* lpPktBase); // 캐릭터 정보 얻기
bool PktSetCharacter (PktBase* lpPktBase); // 캐릭터를 수정한 정보 저장
bool PktDelCharacter (PktBase* lpPktBase); // 캐릭터 삭제 (보류기능)
// 길드
bool PktGuildSearch (PktBase* lpPktBase); // 길드 검색
bool PktRequestGuildMemberList (PktBase* lpPktBase); // 길드 멤버 리스트 요청
bool PktGuildRestoreDataList (PktBase* lpPktBase); // 지워진 길드 리스트 요청
bool PktGuildRight (PktBase* lpPktBase); // 길드 권한
bool PktGuildMemberEdit (PktBase* lpPktBase); // 길드 멤버 권한 수정, 축출
//요새
bool PktFortSearch (PktBase* lpPktBase); // 요새 검색
bool PktMiningCamp (PktBase* lpPktBase); // 채굴요새 정보 얻기
bool PktShopCamp (PktBase* lpPktBase); // 상점요새 정보 얻기
bool PktShopCampGold (PktBase* lpPktBase); // 상점요새 골드 수정
bool PktShopCampTax (PktBase* lpPktBase); // 상점요새 세금 수정
//성
bool PktCastleSearch (PktBase* lpPktBase); // 성 검색
bool PktCastleCreature (PktBase* lpPktBase); // 성 검색
// 운영 창고
bool SendAdminStoreList (void); // 운영자 창고 정보 보내기
bool PktAdminStoreInsert (PktBase* lpPktBase); // 운영자 창고 사용 (아이템 등록)
bool PktAdminStoreDelete (PktBase* lpPktBase); // 운영자 창고 사용 (아이템 삭제)
bool PktGetAdminStoreItem (PktBase* lpPktBase); // 운영자 창고 아이템 정보 요청
bool PktUpdateAdminStore (PktBase* lpPktBase); // 운영자 창고 사용 (아이템 수정)
// 복구 및 블럭
bool PktDelCharList (PktBase* lpPktBase); // 삭제된 캐릭터 목록 검색
bool PktCharRestore (PktBase* lpPktBase); // 캐릭터 복구
bool PktSearchBlock (PktBase* lpPktBase); // 블럭 목록 검색
bool PktAddBlockUser (PktBase* lpPktBase); // 블럭
bool PktDelBlockUser (PktBase* lpPktBase); // 블럭 해제
// 서버 통합 관련
bool PktUnifiedCharInfo (PktBase* lpPktBase); // 통합 캐릭터 정보
bool PktUnifiedGuildInfo (PktBase* lpPktBase); // 통합 길드 정보
bool PktDetailCharInfo (PktBase* lpPktBase); // 통합 캐릭터 상세 정보
// 기타
bool PktGameAdmin (PktBase* lpPktBase); // 게임 운영자 관련
bool PktItemQtyControlData (PktBase* lpPktBase); // 이벤트 아이템 수량 제어
bool PktCheckName (PktBase* lpPktBase); // 캐릭명 중복 체크
bool PktForcedDis (PktBase* lpPktBase); // 강제 접속 끊기
bool PktUserBillingLogRequest (PktBase* lpPktBase); // 유저 과금 내역 로그 요청
bool PktSetZoneList (PktBase* lpPktBase); // 존 좌표 템플릿 저장
bool SendZoneList (void); // 존 좌표 템플릿 리스트 보내기
bool PktConnectAllServerz (PktBase* lpPktBase); // 운영서버에서 모든 중계서버 접속
bool SendConnectedServerIndex (void); // 접속 중인 중계서버 리스트 보내기
bool PktInterestedUser (PktBase* lpPktBase); // 관심 유저 관련 (등록, 삭제, 리스트 요청)
bool ReqInterestedUserList (char* szQuery); // 관심 유저 리스트 요청
bool PktConnectionChk (PktBase* lpPktBase); // 접속 확인 및 접속 정보 요청
bool PktConnectedUserList (void); // 접속한 관심 유저 리스트 보내기
bool PktDuplicatedItem (PktBase* lpPktBase); // 중복 아이템 관련 패킷
bool PktItemDistribute (PktBase* lpPktBase); // 아이템 분배
bool PktShiftToUID (PktBase* lpPktBase); // UID, 계정명간 변환
bool PktAmountOfGold (PktBase* lpPktBase); // 서버그룹 골드량 확인
bool PktGMLogMsg (PktBase* lpPktBase); // GM 로그 메세지 (UID, CID 단위 로그)
bool PktSearchCharInfoTime (PktBase* lpPktBase); // 캐릭터 생성/수정 정보 확인
// Ack 전용
bool PktNewAdminAck(char* szAccount); // 운영 계정 생성 Ack
bool PktDelAdminAck(char* szAccount); // 운영 계정 삭제 Ack
bool PktUpdateLevAck(char* szAccount, unsigned char Level); // 운영 계정LV 변경 Ack
bool PktUpdateIPAck(char* szAccount, char* szIP); // 운영 계정 접속 제한 IP변경 Ack
bool PktSearchUIDAck(unsigned long UID, unsigned int nOldServerID, unsigned long dwKey, bool& bResult); // UID 검색 Ack
bool PktSearchCIDAck(unsigned long CID, unsigned long dwGroup, unsigned long dwKey, bool& bResult); // CID 검색 Ack
bool PktSearchResultAck (unsigned char Result, unsigned long dwRequestKey); // 검색 결과 Ack
CBuffer* MakeCreateItemAck(unsigned long dwRequestKey, unsigned long dwCID, unsigned __int64 dwItemID, unsigned short dwPrototypeID, PktAdminMgr::PktCreateItem* lpCreateItem);
CBuffer* MakeUpdateItemAck(unsigned long dwRequestKey, unsigned long dwCID, unsigned __int64 dwItemID, unsigned short dwPrototypeID, PktAdminMgr::PktUpdateItem* lpUpdateItem);
CBuffer* MakeRemoveItemAck(unsigned long dwRequestKey, unsigned long dwCID, unsigned __int64 dwItemID, unsigned short dwPrototypeID, PktAdminMgr::PktRemoveItem* lpRemoveItem);
CBuffer* MakeItemResetAck(unsigned long dwRequestKey, unsigned long dwCID, PktAdminMgr::PktItemReset* lpPktItemReset);
bool DepositCheckIt(ItemData::CDepositLock& DepositLock, unsigned long dwUID, unsigned long dwCID); // 창고 사용 가능 여부 판별
bool m_bLogin; // 로그인 여부
unsigned char m_MyAuthority; // 현재 로그인된 관리자의 권한마스크
unsigned int m_MyUID; // 클라이언트 식별자
unsigned int m_MyLogID; // 업데이트할 LogID
unsigned int m_nAgentType; // 중계서버 타입
unsigned int m_nIPCheck; // 운영자 로그인시 IP 체크
char m_szToolNation[256]; // 국가 타입
CDetailLog m_DetailLog; // DB에 로그 남기기 위한 인스턴스
char m_szAccount[20]; // Dispatch를 사용하고 있는 관리자 계정
bool SendLoginInfo(char* szAccount); // 계정정로를 클라이이언트로 보냄
bool SendAgentServerInfo(void); // 중계서버명과 인덱스를 보냄
char* GetItemState(unsigned char cTake); // 아이템 위치 정보 문자열 얻기
unsigned char SetAuthorityMask(unsigned char cLV);
};
#endif

View File

@@ -0,0 +1,5 @@
#ifndef _RYL_ADMIN_MGR_SERVER_STRUCT_H_
#define _RYL_ADMIN_MGR_SERVER_STRUCT_H_
#endif

View File

@@ -0,0 +1,62 @@
#include "stdafx.h"
#include <crtdbg.h>
#include <Thread/Lock.h>
#include <Utility/Debug/ExceptionReport.h>
#include <Log/ServerLog.h>
#include "RYL_AdminManagerServer.h"
#include "resource.h"
#include <GameGuardLib/ggsrv.h>
GGAUTHS_API void NpLog(int mode, char* msg)
{
}
GGAUTHS_API void GGAuthUpdateCallback(PGG_UPREPORT report)
{
}
// !Execption
int WINAPI ExceptionUserFunc(char* szBuffer, int nBufferLen)
{
g_Log.Flush();
g_SessionLog.Flush();
return _snprintf(szBuffer, nBufferLen, "Exception Occured. Flush all buffers.");
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
CNamedMutex Mutex("ROWAdminToolServer", true);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(NULL, "Already AdminToolServer process exist.", "Err", MB_OK);
return false;
}
// Exception ¿É¼Ç ¼³Á¤
unsigned long dwExceptionFeatures =
CExceptionReport::CATCH_EXCEPTION | CExceptionReport::USE_MINIDUMP | CExceptionReport::USE_REPORT;
CExceptionReport::GetInstance().Enable(dwExceptionFeatures);
CExceptionReport::GetInstance().SetDumpLevel(MiniDumpWithFullMemory);
CExceptionReport::GetInstance().SetUserFunc(ExceptionUserFunc);
CRylAdminManagerServer& RylAdminMgrServer = CRylAdminManagerServer::GetInstance();
// ¼­¹ö ÃʱâÈ­
if(RylAdminMgrServer.Initialize(
hInstance, "AdminToolServer", lpCmdLine, IDI_TRAY_ICON, IDR_MENU_POPUP))
{
RylAdminMgrServer.ProcessMessage();
}
return false;
}

View File

@@ -0,0 +1,89 @@
#include "stdafx.h"
#include "resource.h"
#include "RYL_AdminManagerServer.h"
#include "RYL_AgentServerTable.h"
#include <BaseLibrary/Log/ServerLog.h>
#include <RylServerLibrary/Utility/ServerAppFramework/MsgProc/MsgProc.h>
#include <RylServerLibrary/Utility/ServerAppFramework/ConsoleWindow/ConsoleWindow.h>
#include <RylServerLibrary/Utility/ServerAppFramework/ConsoleWindow/ConsoleCMDFactory.h>
// !Window Message Class
class CProcessCOMMAND : public CMsgProc
{
public:
CProcessCOMMAND(CConsoleWindow& ConsoleWindow) : m_ConsoleWindow(ConsoleWindow) { }
virtual ~CProcessCOMMAND() { }
// !WM_COMMAND Message
virtual LRESULT operator () (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
char* szCommand = 0;
switch (LOWORD(wParam))
{
case ID_CONNECTALL: szCommand = "connect_all"; break;
case ID_CONSOL_OPENCONSOLE: m_ConsoleWindow.Initialize("AdminManageServer"); break;
case ID_CONSOLE_CLOSECONSOLE: m_ConsoleWindow.Destroy(); break;
}
if(NULL != szCommand)
{
m_ConsoleWindow.GetCMDProcess().Add(
m_ConsoleWindow.GetConsoleCMDFactory().Create(szCommand, strlen(szCommand)));
}
if(LOWORD(wParam) == ID_FLUSH)
{
DETLOG0(g_Log, "Flush Log");
g_Log.Flush();
}
if(LOWORD(wParam) == ID_QUIT)
{
DETLOG0(g_Log, "AdminManageServer systray end");
PostMessage(hWnd, WM_QUIT, 0, 0);
}
return 0;
}
private:
CConsoleWindow& m_ConsoleWindow;
};
// !Window Message Class
class CWM_DESTROY : public CMsgProc
{
public:
// !WM_DESTROY Message
virtual LRESULT operator () (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
};
// !Window Message Class Initialize
bool CRylAdminManagerServer::InitializeMsgProc()
{
int nErrorCount = 0;
CMsgProcessMgr* lpMsgProcessMgr = GetMsgProcessMgr();
if(0 != lpMsgProcessMgr)
{
if(GetConsoleWindow())
{
nErrorCount += lpMsgProcessMgr->Register(WM_COMMAND,
new CProcessCOMMAND(*GetConsoleWindow())) ? 0 : 1;
}
nErrorCount += lpMsgProcessMgr->Register(WM_DESTROY, new CWM_DESTROY) ? 0 : 1;
}
return (0 == nErrorCount);
}

View File

@@ -0,0 +1,760 @@
#include "stdafx.h"
#include "RYL_AgentServerTable.h"
#include "RYL_AgentServerDispatch.h"
#include "RYL_AdminMgrDispatch.h"
#include <Parser/ServerInfo.h>
#include <Item/ItemFactory.h>
#include <Log/ServerLog.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/ServerPacket.h>
#include <Network/Packet/PacketStruct/GuildPacket.h>
#include <Network/Winsock/SocketFactory.h>
#include <Network/Protocol/RYL_AdminMgrProtocol.h>
#include <Network/Buffer/RYL_CumulateBuffer.h>
#include <Network/Session/Session.h>
#include "ClientDispatchTable.h"
CMultiDispatch& CRylAgentServerDispatch::GetDispatchTable()
{
static CMultiDispatch multiDispatch;
return multiDispatch;
}
void CRylAgentServerDispatch::SetDispatchInfo(long dwServerGroup, char* ServerName)
{
m_dwServerGroup = dwServerGroup;
strncpy(m_szServerName, ServerName, 256);
}
void CRylAgentServerDispatch::Destroy()
{
delete this;
}
bool CRylAgentServerDispatch::DispatchPacket(PktBase* lpPktBase)
{
unsigned char cCmd = lpPktBase->GetCmd();
switch(cCmd)
{
case PktAgentServer::PktCMD::CmdSysServerLogin: return CmdSysServerLogin(lpPktBase);
case PktAgentServer::PktCMD::CmdAdminToolGetData: return CmdAdminToolGetData(lpPktBase);
case PktAgentServer::PktCMD::CmdAdminToolSetData: return CmdAdminToolSetData(lpPktBase);
case CmdItemQtyCheck: return ItemQtyControlAck(lpPktBase);
case CmdGuildPosition: return GuildPositionAck(lpPktBase);
}
return true;
}
bool CRylAgentServerDispatch::CmdAdminToolGetData(PktBase* lpPktBase)
{
PktAgentServer::PktAdminToolGetDataAck* lpGetDataAck =
static_cast<PktAgentServer::PktAdminToolGetDataAck*>(lpPktBase);
char* lpData = reinterpret_cast<char*>(lpGetDataAck + 1);
CServerRequestKeeper::RequestInfo RequestInfo;
unsigned long dwUID = lpGetDataAck->m_dwUID;
unsigned long dwCID = lpGetDataAck->m_dwCID;
unsigned long dwRequestKey = lpGetDataAck->m_dwRequestKey;
unsigned short cError = lpGetDataAck->GetError();
bool bResult = false;
// 캐릭터 이름 변경 ----------------------------------------------------------------------------------
if (PktAgentServer::PktAdminToolGetData::CHANGE_CHAR_NAME == lpGetDataAck->m_cType)
{
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktChangeName));
PktAdminMgr::PktChangeName* lpPktChangeName =
reinterpret_cast<PktAdminMgr::PktChangeName*>(lpBuffer->begin());
lpPktChangeName->m_dwCID = dwCID;
lpPktChangeName->m_dwServerGroup = m_dwServerGroup;
lpPktChangeName->m_dwRequest = dwRequestKey;
lpPktChangeName->m_dwUID = (unsigned long)cError;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktChangeName), PktAdminMgr::PktCMD::PktChangeNameAck, 0, 0))
{
ERRLOG0(g_Log, "패킷 랩핑 실패");
SAFE_RELEASE_BUFFER(lpBuffer);
}
else
{
if (false == CClientDispatchTable::GetInstance().SendAll(lpBuffer))
{
ERRLOG0(g_Log, "운영 클라이언트로 정보 전송 실패");
SAFE_RELEASE_BUFFER(lpBuffer);
}
}
return true;
}
//----------------------------------------------------------------------------------------------------
unsigned short ExtraLength =
(lpGetDataAck->GetLen() - sizeof(PktAgentServer::PktAdminToolGetDataAck));
if (!m_AgentRequestKeeper.GetRequest(dwRequestKey, RequestInfo))
{
ERRLOG1(g_Log, "검색 요청 실패: 요청키- %d", dwRequestKey);
return true;
}
CModifyCharacter* lpModifyChar = m_ModifyCharMgr.GetCharacter(dwCID);
if ((cError != 0) || (NULL == lpModifyChar))
{
m_ModifyCharMgr.EraseChar(dwCID);
m_AgentRequestKeeper.Pop(dwRequestKey);
ERRLOG1(g_Log, "캐릭터 정보 받기 실패: err- %d", cError);
return true;
}
switch(lpGetDataAck->m_cType)
{
case PktAgentServer::PktAdminToolGetData::CHAR_BASIC_DATA:
bResult = m_ParseData.PARSE_CHAR_BASIC_DATA(lpModifyChar, lpData);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::CHAR_BASIC_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::CHAR_EXTRA_DATA:
bResult = m_ParseData.PARSE_CHAR_EXTRA_DATA(lpModifyChar, lpData);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::CHAR_EXTRA_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::CHAR_FRIEND_DATA:
bResult = m_ParseData.PARSE_CHAR_FRIEND_DATA(lpModifyChar, lpData, ExtraLength);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::CHAR_FRIEND_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::CHAR_BAN_DATA:
bResult = m_ParseData.PARSE_CHAR_BAN_DATA(lpModifyChar, lpData, ExtraLength);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::CHAR_BAN_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::STORE_12_DATA:
bResult = m_ParseData.PARSE_STORE_12_DATA(lpModifyChar, lpData);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::STORE_12_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::STORE_34_DATA:
bResult = m_ParseData.PARSE_STORE_34_DATA(lpModifyChar, lpData);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::STORE_34_DATA);
}
break;
case PktAgentServer::PktAdminToolGetData::FINISH_GET_DATA:
lpModifyChar->SetUID(dwUID);
lpModifyChar->SetCID(dwCID);
lpModifyChar->SetOldServerGroup(lpGetDataAck->m_cOldServerGroupID);
bResult = PARSE_FINISH_GET_DATA(dwRequestKey);
if(bResult)
{
SEND_CLIENT_DATA(lpPktBase, RequestInfo, PktAdminMgr::PktGetCharacterAck::FINISH_GET_DATA);
SyncDeposit(dwUID, dwCID, RequestInfo);
}
break;
}
if (!bResult)
{
m_AgentRequestKeeper.Pop(dwRequestKey);
m_ModifyCharMgr.EraseChar(dwCID);
ERRLOG4(g_Log, "캐릭터 데이터 초기화 실패: 요청키- %d, UID- %d, CID- %d, cType- %c",
dwRequestKey, dwUID, dwCID, lpGetDataAck->m_cType );
return true;
}
return true;
}
bool CRylAgentServerDispatch::UpdateCharacter(CModifyCharacter* lpChar, unsigned __int64 dwSerial,
unsigned long dwUID, unsigned long dwCID, unsigned long dwRequestKey)
{
return m_ParseData.UpdateCharacter(lpChar, dwSerial, dwUID, dwCID, dwRequestKey);
}
bool CRylAgentServerDispatch::PARSE_FINISH_GET_DATA(unsigned long dwRequestKey)
{
m_AgentRequestKeeper.Pop(dwRequestKey);
return true;
}
// TODO : 현재 다른 운영자가 해당 창고를 편집중이면 다른 운영자의 운영 클라이언트에도 동기화 필요;
bool CRylAgentServerDispatch::SyncDeposit(unsigned long dwUID, unsigned long dwCID,
CServerRequestKeeper::RequestInfo& Info)
{
ItemData::CDepositLock::DepositInfo LockInfo;
unsigned short DepositBufferSize = sizeof(PktAdminMgr::PktSyncDeposit) + sizeof(STORE);
if (m_DepositLock.GetLockInfo(dwUID, LockInfo))
{
CModifyCharacter* lpCharacter = m_ModifyCharMgr.GetCharacter(LockInfo.m_dwCID);
if ((NULL != lpCharacter) && (LockInfo.m_dwCID != dwCID))
{
CModifyCharacter* lpSyncChar = m_ModifyCharMgr.GetCharacter(dwCID);
if (NULL != lpSyncChar)
{
Item::CDepositContainer& SyncContainer = lpSyncChar->GetDeposit();
SyncContainer.GetTab(0)->ClearItems();
SyncContainer.GetTab(1)->ClearItems();
SyncContainer.GetTab(2)->ClearItems();
SyncContainer.GetTab(3)->ClearItems();
for (int cnt = 0;cnt < 2; ++cnt)
{
CCumulateBuffer cBuffer(DepositBufferSize, &Info.m_lpPacketDispatch->GetSession());
unsigned short usBufferSize = DepositBufferSize;
char* lpBuffer = cBuffer.GetBuffer(sizeof(PktAdminMgr::PktSyncDeposit));
PktAdminMgr::PktSyncDeposit* lpSyncDeposit =
reinterpret_cast<PktAdminMgr::PktSyncDeposit*>(lpBuffer);
char* DepositBuffer = reinterpret_cast<char*>(lpSyncDeposit + 1);
LPSTORE lpStore = reinterpret_cast<LPSTORE>(DepositBuffer);
Item::CDepositContainer& DepositContainer = lpCharacter->GetDeposit();
const Item::CItemContainer* lpContainer0 = DepositContainer.GetTab((cnt * 2));
const Item::CItemContainer* lpContainer1 = DepositContainer.GetTab((cnt * 2) + 1);
lpSyncDeposit->m_dwUID = dwUID;
lpSyncDeposit->m_dwRequestID = Info.m_dwClientRequest;
if (cnt == 0)
{
lpSyncDeposit->m_cType = PktAdminMgr::PktSyncDeposit::Tab12;
}
else if(cnt == 1)
{
lpSyncDeposit->m_cType = PktAdminMgr::PktSyncDeposit::Tab34;
}
if ((NULL != lpContainer0) && (NULL != lpContainer1))
{
lpStore->dwSize = STORE::MAX_STORE_SIZE;
if (lpContainer0->SerializeOut(lpStore->Data, lpStore->dwSize))
{
unsigned long dwContainer0Size = lpStore->dwSize;
lpStore->dwSize = STORE::MAX_STORE_SIZE - dwContainer0Size;
if (lpContainer1->SerializeOut(lpStore->Data + dwContainer0Size, lpStore->dwSize))
{
lpStore->dwSize += dwContainer0Size;
cBuffer.ResizeLength(usBufferSize);
m_ParseData.PARSE_STORE_12_DATA(lpSyncChar, DepositBuffer);
PacketWrap::WrapHeader(lpBuffer,
usBufferSize, PktAdminMgr::PktCMD::PktDepositSync, 0 , 0);
}
}
}
else
{
cBuffer.ResizeLength(0);
}
}
}
}
}
return true;
}
// 클라이언트에게 AgentServer로부터 받은 GetData를 보낸다.
bool CRylAgentServerDispatch::SEND_CLIENT_DATA(PktBase* lpPktBase, CServerRequestKeeper::RequestInfo& Info,
unsigned char cType)
{
PktAgentServer::PktAdminToolGetDataAck* lpSGetData =
static_cast<PktAgentServer::PktAdminToolGetDataAck*>(lpPktBase);
CSession* lpSession = &Info.m_lpPacketDispatch->GetSession();
unsigned short Src_CpySize = lpSGetData->GetLen() - sizeof(PktAgentServer::PktAdminToolGetDataAck);
char* Src_DataBuffer = reinterpret_cast<char*>(lpSGetData + 1);
unsigned short PktLength = Src_CpySize + sizeof(PktAdminMgr::PktGetCharacterAck);
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), PktLength);
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAdminMgr::PktGetCharacterAck* lpPktGetChar =
reinterpret_cast<PktAdminMgr::PktGetCharacterAck*>(lpBuffer->begin());
char* Des_DataBuffer = reinterpret_cast<char*>(lpPktGetChar + 1);
lpPktGetChar->m_dwCID = lpSGetData->m_dwCID;
lpPktGetChar->m_dwUID = lpSGetData->m_dwUID;
lpPktGetChar->m_dwServerGroup = m_dwServerGroup;
lpPktGetChar->m_cOldServerGroupID = lpSGetData->m_cOldServerGroupID;
lpPktGetChar->m_dwRequestKey = Info.m_dwClientRequest;
lpPktGetChar->m_cType = cType;
CopyMemory(Des_DataBuffer, Src_DataBuffer, Src_CpySize);
if (false == PacketWrap::WrapHeader(lpBuffer,
PktLength, PktAdminMgr::PktCMD::PktGetCharacterAck, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == lpSession->SendPending(lpBuffer))
{
ERRLOG3(g_Log, "Packet sending to client failed : UID- %d, CID- %d, cType- %d",
lpSGetData->m_dwUID, lpSGetData->m_dwCID, cType);
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
return false;
}
return true;
}
bool CRylAgentServerDispatch::CmdAdminToolSetData(PktBase* lpPktBase)
{
PktAgentServer::PktAdminToolSetDataAck* lpSetDataAck =
static_cast<PktAgentServer::PktAdminToolSetDataAck*>(lpPktBase);
CServerRequestKeeper::RequestInfo RequestInfo;
CModifyCharacter* lpModifyCharacter = NULL;
unsigned long dwUID = lpSetDataAck->m_dwUID;
unsigned long dwCID = lpSetDataAck->m_dwCID;
unsigned long dwRequestKey = lpSetDataAck->m_dwRequestKey;
unsigned long cError = lpSetDataAck->GetError();
bool bResult = false;
CModifyCharacter* lpModifyChar = m_ModifyCharMgr.GetCharacter(dwCID);
if (NULL == lpModifyChar)
{
// 로그작성
m_AgentRequestKeeper.Pop(dwRequestKey);
return true;
}
if (true != m_AgentRequestKeeper.GetRequest(dwRequestKey, RequestInfo))
{
ERRLOG1(g_Log, "Requestkey searching failed : requestkey- %d", dwRequestKey);
m_ModifyCharMgr.EraseChar(dwCID);
return true;
}
if (0 != cError)
{
CRylAdminMgrDispatch* lpClientDispatch =
static_cast<CRylAdminMgrDispatch*>(RequestInfo.m_lpPacketDispatch);
if (NULL != lpClientDispatch)
{
switch(cError)
{
case PktAgentServer::PktAdminToolSetData::UNKNOWN_ERROR:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::UNKNOWN_ERROR);
break;
case PktAgentServer::PktAdminToolSetData::INVALID_UID_CID_ERROR:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::INVALID_UID_CID_ERROR);
break;
case PktAgentServer::PktAdminToolSetData::LOGIN_ANOTHER_GAMESERVER:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::LOGIN_ANOTHER_GAMESERVER);
break;
case PktAgentServer::PktAdminToolSetData::SESSION_OPEN_FAILED:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::SESSION_OPEN_FAILED);
break;
case PktAgentServer::PktAdminToolSetData::ALREADY_LOGIN_USER_SESSION_OPEN:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::ALREADY_LOGIN_USER_SESSION_OPEN);
break;
case PktAgentServer::PktAdminToolSetData::ANOTHER_CHAR_LOAD_FAILED:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::ANOTHER_CHAR_LOAD_FAILED);
break;
case PktAgentServer::PktAdminToolSetData::SETTING_DATA_FAILED:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::SETTING_DATA_FAILED);
break;
case PktAgentServer::PktAdminToolSetData::SESSION_START_FAILED:
lpClientDispatch->SendResult(PktAdminMgr::PktResult::SESSION_START_FAILED);
break;
}
}
else
{
ERRLOG0(g_Log, "Client dispatch searching failed");
}
ERRLOG1(g_Log, "Data sending failed : CMD- %d", cError);
m_ModifyCharMgr.EraseChar(dwCID);
return true;
}
switch(lpSetDataAck->m_cType)
{
case PktAgentServer::PktAdminToolSetData::FINISH_UPDATE_DATA:
m_AgentRequestKeeper.Pop(dwRequestKey); // 리퀘스트 삭제
lpModifyCharacter = m_ModifyCharMgr.GetCharacter(dwCID); // 캐릭터 정보를 가져온다.
if (NULL != lpModifyCharacter)
{
ItemData::CDepositLock::DepositInfo Info;
if (m_DepositLock.GetLockInfo(dwUID, Info)) // 현재 다른 사용자가 창고를 독점하고 있다.
{
if( ( Info.m_lpPacketDispatch == RequestInfo.m_lpPacketDispatch ) && // 독점하고 있는 사람이 나라면..
( Info.m_dwCID == dwCID ) )
{
if( true == lpModifyCharacter->isClose() ) // 작업완료후 캐릭터를 닫을까?
{
// 창고데이터 독점 권한 해제
m_DepositLock.DepositUnLock( dwUID );
}
}
}
// 저장후 삭제 대기라면... 편집리스트에서 삭제시켜주자
if( true == lpModifyCharacter->isClose() )
{
m_ModifyCharMgr.EraseChar( lpModifyCharacter->GetCID() );
}
else
{
// 저장 종료
lpModifyCharacter->SetSaveState(false);
}
}
break;
}
return true;
}
void CRylAgentServerDispatch::SetPaseSession()
{
m_ParseData.SetSession(&GetSession());
}
bool CRylAgentServerDispatch::Send(CBuffer* lpBuffer)
{
return GetSession().SendPending(lpBuffer);
}
void CRylAgentServerDispatch::Connected()
{
unsigned long dwServerGroup =
CAgentServerTable::GetInstance().GetGroupFromDBAgentIP(
GetSession().GetRemoteAddr().get_addr_in().sin_addr.S_un.S_addr);
if (CAgentServerTable::MAX_AGENT_SERVER <= dwServerGroup)
{
ERRLOG2(g_Log, "최대 서버그룹(%d)을 넘는 서버그룹으로 접속 시도: 그룹인덱스 - %d",
CAgentServerTable::MAX_AGENT_SERVER, dwServerGroup);
}
else
{
ServerLogin(dwServerGroup);
}
}
void CRylAgentServerDispatch::Disconnected()
{
GetDispatchTable().RemoveDispatch(m_dwServerGroup);
CAgentServerTable::GetInstance().Disconnected(
GetSession().GetRemoteAddr().get_addr_in().sin_addr.S_un.S_addr);
ConnectedAgentListAck(); // 클라이언트의 중계서버 연결 상태창 갱신
}
// 중계서버에 로그인
bool CRylAgentServerDispatch::ServerLogin(unsigned long dwServerGroup)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAgentServer::PktSL));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAgentServer::PktSL* lpPktSL = reinterpret_cast<PktAgentServer::PktSL*>(lpBuffer->begin());
const int MAX_ADDRESS = 128;
char szAddress[MAX_ADDRESS];
CTCPFactory TcpFactory;
TcpFactory.GetNetworkInfo(szAddress, MAX_ADDRESS);
lpPktSL->m_Address.S_un.S_addr = inet_addr(szAddress);
char cChannel = 0;
CServerInfo& InfoScript = CServerInfo::GetInstance();
if(InfoScript.Reload())
{
const int MAX_BUFFER = 256;
const char* szCHBuffer = InfoScript.GetValue("SERVER_CH");
char szCH[MAX_BUFFER];
if(NULL != szCHBuffer)
{
strncpy(szCH, szCHBuffer, MAX_BUFFER);
szCH[MAX_BUFFER - 1] = 0;
cChannel = (char)atoi(szCH);
}
}
SERVER_ID serverID;
serverID.sID.Channel = cChannel;
serverID.sID.Group = static_cast<unsigned char>(dwServerGroup);
serverID.sID.ID = SERVER_ID::ADMIN_TOOL_ZONE;
serverID.sID.Type = CServerSetup::AdminToolServer;
m_dwServerID = lpPktSL->m_dwServerID = serverID.dwID;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAgentServer::PktSL), PktAgentServer::PktCMD::CmdSysServerLogin, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == GetSession().SendPending(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
return false;
}
return true;
}
// 중계서버 로그인에 성공했을 경우 Ack
bool CRylAgentServerDispatch::CmdSysServerLogin(PktBase* lpPktBase)
{
SERVER_ID SID;
PktSLAck* lpPktSLAck = static_cast<PktSLAck*>(lpPktBase);
const unsigned char MAX_BUFFER = 255;
SID.dwID = m_dwServerID;
Item::CItemFactory::GetInstance().SetItemUID(lpPktSLAck->m_dlItemUID);
// 로그인 성공시 DispatchTable에 추가
GetDispatchTable().SetDispatch(SID.GetGroup(), this);
CServerInfo& InfoScript = CServerInfo::GetInstance();
char szTmp[MAX_BUFFER];
_snprintf(szTmp, MAX_BUFFER, "SERVERGROUP_NAME_%02d", SID.GetGroup());
const char* szGroupName = InfoScript.GetValue(szTmp);
if(NULL != szGroupName)
{
char szServerNameBuffer[MAX_BUFFER];
strncpy(szServerNameBuffer, szGroupName, MAX_BUFFER); szServerNameBuffer[MAX_BUFFER - 1] = 0;
SetDispatchInfo(SID.GetGroup(), szServerNameBuffer);
ConnectedAgentListAck(); // 클라이언트 갱신
}
return true;
}
bool CRylAgentServerDispatch::ItemQtyControlAck(PktBase* lpPktBase)
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktItemQtyControl));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAdminMgr::PktItemQtyControl* lpPktItemQtyControl =
reinterpret_cast<PktAdminMgr::PktItemQtyControl*>(lpBuffer->begin());
*lpPktItemQtyControl = *reinterpret_cast<PktAdminMgr::PktItemQtyControl*>(lpPktBase);
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktItemQtyControl), PktAdminMgr::PktCMD::PktItemQtyControl, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == CClientDispatchTable::GetInstance().SendAll(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
return false;
}
return true;
}
bool CRylAgentServerDispatch::GuildPositionAck(PktBase* lpPktBase)
{
bool bIsReleased = true;
PktGuildPosition* lpPktGuildPosition =
reinterpret_cast<PktGuildPosition*>(lpPktBase);
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktGuildMemberEdit));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAdminMgr::PktGuildMemberEdit* lpPktGuildMemberEdit =
reinterpret_cast<PktAdminMgr::PktGuildMemberEdit*>(lpBuffer->begin());
lpPktGuildMemberEdit->m_dwGID = lpPktGuildPosition->m_dwGID;
lpPktGuildMemberEdit->m_dwCID = lpPktGuildPosition->m_dwCID;
lpPktGuildMemberEdit->m_cPosition = lpPktGuildPosition->m_cPosition;
lpPktGuildMemberEdit->m_cType = lpPktGuildPosition->m_cType;
if (false == PacketWrap::WrapHeader(lpBuffer, sizeof(PktAdminMgr::PktGuildMemberEdit),
PktAdminMgr::PktCMD::PktGuildMemberEdit, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (false == CClientDispatchTable::GetInstance().SendAll(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
return false;
}
return true;
}
// 중계서버와 접속, 끊김이 일어날때 클라이언트로 정보 보내기
bool CRylAgentServerDispatch::ConnectedAgentListAck()
{
bool bIsReleased = true;
CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(PktAdminMgr::PktConnectAllServerz));
if (NULL == lpBuffer)
{
ERRLOG0(g_Log, "버퍼 생성 실패");
return false;
}
PktAdminMgr::PktConnectAllServerz* lpConnectAllServerz = new PktAdminMgr::PktConnectAllServerz;
ZeroMemory(lpConnectAllServerz->m_nConnectedServerIndex, sizeof(lpConnectAllServerz->m_nConnectedServerIndex));
int nArrayIndex = 0;
for(unsigned int nIndex = 0; nIndex < CAgentServerTable::MAX_AGENT_SERVER; ++nIndex)
{
if(NULL != CAgentServerTable::GetInstance().GetDispatch(nIndex)) // 중계서버 연결 체크
{
// 배열 앞부분부터 차례대로 '연결된 서버 인덱스 + 1' 을 대입
lpConnectAllServerz->m_nConnectedServerIndex[nArrayIndex] = nIndex + 1;
++nArrayIndex;
}
}
*reinterpret_cast<PktAdminMgr::PktConnectAllServerz*>(lpBuffer->wr_ptr()) = *lpConnectAllServerz;
if (false == PacketWrap::WrapHeader(lpBuffer,
sizeof(PktAdminMgr::PktConnectAllServerz), PktAdminMgr::PktCMD::PktRefreshConnectedList, 0, 0))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
else
{
if (NULL != lpConnectAllServerz)
{
delete lpConnectAllServerz;
lpConnectAllServerz = NULL;
}
if (false == CClientDispatchTable::GetInstance().SendAll(lpBuffer))
{
ERRLOG0(g_Log, "수동으로 패킷을 릴리스합니다.");
bIsReleased = false;
}
}
if (false == bIsReleased)
{
SAFE_RELEASE_BUFFER(lpBuffer);
return false;
}
return true;
}

View File

@@ -0,0 +1,80 @@
#ifndef _RYL_AGENTSERVER_DISPATCH_H_
#define _RYL_AGENTSERVER_DISPATCH_H_
#include "RYL_ServerRequestKeeper.h"
#include < Character/ModifyCharacter.h >
#include < Network/Dispatch/RylServerDispatch.h >
#include < Network/Dispatch/MultiDispatchStorage.h >
#include < Stream/Buffer/BufferFactory.h >
#include < Network/AgentServerParseData/RYL_AgentServerParseData.h >
namespace PktAgentServer
{
struct PktAdminToolSetData;
};
struct PktBase;
class CBuffer;
/*!
\class CRylAgentServerDispatch
중계 서버로부터 받은 패킷 처리
*/
class CRylAgentServerDispatch : public CRylServerDispatch
{
public:
CRylAgentServerDispatch(CSession& Session)
: CRylServerDispatch(Session, 10){ ;}
// 현재 연결이 유지되어있는 서버테이블
static CMultiDispatch& GetDispatchTable();
virtual void Connected(void); // 접속 이벤트
virtual void Disconnected(void); // 접속 끊김 이벤트
virtual void Destroy(void); // 파괴 이벤트
void SetDispatchInfo(long dwServerGroup, char* ServerName); // 서버의 이름 및ID를 입력함
CServerRequestKeeper& GetRequestKeeper() { return m_AgentRequestKeeper; } // 해당 서버Dispatch의 RequestKeeper을 가져옴
const char* GetName() { return m_szServerName; } // 서버이름을 가져옴
bool Send(CBuffer* lpBuffer);
bool CmdSysServerLogin(PktBase* lpPktBase); // 서버로그인
bool CmdAdminToolGetData(PktBase* lpPktBase); // 캐릭터 데이터 가져오기
bool CmdAdminToolSetData(PktBase* lpPktBase); // 캐릭터 데이터 저장하기
bool ServerLogin(unsigned long dwServerGroup); // 서버 로그인 패킷을 전송
CModifyCharacterMgr& GetModifyCharacterMgr() { return m_ModifyCharMgr; } // 해당 서버에 에디팅중인 캐릭터 목록을 가져온다.
bool UpdateCharacter(CModifyCharacter* lpChar, unsigned __int64 dwSerial, unsigned long dwUID, unsigned long dwCID, unsigned long dwRequestKey);
void SetPaseSession(); // 서버의 Session을 캐릭터정보 Parser에 넘겨준다
ItemData::CDepositLock& GetDepositLock() { return m_DepositLock; } // 창고 장금 목록을 가져온다.
bool ItemQtyControlAck(PktBase* lpPktBase);
bool GuildPositionAck(PktBase* lpPktBase);
bool ConnectedAgentListAck(void);
private:
long m_dwServerGroup; ///< 연결중인 서버그룹 인덱스
unsigned long m_dwServerID; ///< 연결중인 서버 ID
char m_szServerName[256]; ///< 연결중인 서버그룹명
CServerRequestKeeper m_AgentRequestKeeper;
CModifyCharacterMgr m_ModifyCharMgr;
CAgentServerParseData m_ParseData;
ItemData::CDepositLock m_DepositLock;
CDefaultBufferFactory m_DefultBufferFactory;
bool DispatchPacket(PktBase* lpPktBase);
bool SEND_CLIENT_DATA(PktBase* lpPktBase, CServerRequestKeeper::RequestInfo& Info, unsigned char cType);
bool PARSE_FINISH_GET_DATA(unsigned long dwRequestKey);
bool SyncDeposit(unsigned long dwUID, unsigned long dwCId, CServerRequestKeeper::RequestInfo& Info);
};
#endif

View File

@@ -0,0 +1,548 @@
#include "stdafx.h"
#include "RYL_AgentServerTable.h"
#include "RYL_AgentServerDispatch.h"
#include <DBComponent/RYL_GameDB.h>
#include <DBComponent/BillingDB.h>
#include <DBComponent/AuthDB.h>
#include <Network/IOCP/IOCPNet.h>
#include <Network/Session/Session.h>
#include <Network/Session/CreatePolicy.h>
#include <Parser/ServerInfo.h>
#include <Log/ServerLog.h>
CAgentServerTable::CAgentServerTable()
{
Destroy(); // 초기화 대용
m_lpSessionPolicy = SessionPolicy::CreateTCPPolicy<CRylAgentServerDispatch>();
const char* szNation = CServerInfo::GetInstance().GetValue("NATION");
if (NULL != szNation)
{
strncpy(m_szNation , szNation, MAX_BUFFER);
}
else
{
ERRLOG0(g_Log, "운영 서버의 국가 타입 정보를 읽는데 실패했습니다.(셋업파일의 NATION값을 확인하십시요)");
exit(1);
}
}
CAgentServerTable::~CAgentServerTable()
{
Destroy();
}
void CAgentServerTable::Destroy()
{
// AgentServer Dispatch 를 전부 NULL로 채워버린다
m_IPtoServerID.clear();
// GameDB 객체 전부 소멸
CGameDB** DBfirst = m_lpGameDB;
CGameDB** DBlast = m_lpGameDB + MAX_AGENT_SERVER;
for(; DBfirst != DBlast; ++DBfirst)
{
CGameDB* lpGameDB = *DBfirst;
if(lpGameDB != NULL)
{
delete lpGameDB;
}
}
std::fill_n(m_lpGameDB, int(MAX_AGENT_SERVER), reinterpret_cast<CGameDB*>(NULL));
if (NULL != m_lpBillingDB)
{
delete m_lpBillingDB;
m_lpBillingDB = NULL;
}
if (NULL != m_lpBillingLogDB)
{
delete m_lpBillingLogDB;
m_lpBillingLogDB = NULL;
}
if (NULL != m_lpAuthDB)
{
delete m_lpAuthDB;
m_lpAuthDB = NULL;
}
if(NULL != m_lpSessionPolicy)
{
delete m_lpSessionPolicy;
m_lpSessionPolicy = NULL;
}
}
void CAgentServerTable::InitAgentServerTable(CIOCPNet& IOCPNetwork)
{
ConnectToAllAgentServerz(IOCPNetwork);
ConnectToBillingDB();
ConnectToAuthDB();
if (0 == strcmp(m_szNation, "KOREA"))
{
ConnectToBillingLogDB();
}
}
CGameDB* CAgentServerTable::GetGameDB(unsigned long dwServerID)
{
if (dwServerID < MAX_AGENT_SERVER)
{
if (m_lpGameDB[dwServerID] != NULL)
{
return m_lpGameDB[dwServerID];
}
}
return NULL;
}
CSession* CAgentServerTable::GetSession(unsigned long dwServerID)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerID,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
return &lpAgentDispatch->GetSession();
}
return NULL;
}
CServerRequestKeeper& CAgentServerTable::GetRequestKeeper(unsigned long dwServerGroup)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
return lpAgentDispatch->GetRequestKeeper();
}
CRylAgentServerDispatch* CAgentServerTable::GetDispatch(unsigned long dwServerID)
{
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerID,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
return lpAgentDispatch;
}
void CAgentServerTable::RemoveAllModifyCharacter(CPacketDispatch* lpPacketDispatch)
{
for(int cnt = 0; cnt < MAX_AGENT_SERVER; cnt++)
{
GET_MULTI_DISPATCH(lpAgentDispatch,
cnt, CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
lpAgentDispatch->GetModifyCharacterMgr().AllRemoveChar(lpPacketDispatch);
}
}
}
void CAgentServerTable::RemoveAllDepositLock(CPacketDispatch* lpPacketDispatch)
{
for(int cnt = 0; cnt < MAX_AGENT_SERVER; cnt++)
{
GET_MULTI_DISPATCH(lpAgentDispatch,
cnt, CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if(NULL != lpAgentDispatch)
{
lpAgentDispatch->GetDepositLock().RemoveAllSelectDispatch(lpPacketDispatch);
}
}
}
void CAgentServerTable::ConnectToAgentServer(CIOCPNet& IOCPNetwork, unsigned long dwServerGroup)
{
DBAgentServerInfo stServerInfo;
if (GetAgentServerInfo(dwServerGroup, stServerInfo))
{
m_IPtoServerID[inet_addr(stServerInfo.szServerAddress)] = dwServerGroup;
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
if ((NULL == lpAgentDispatch) || (!lpAgentDispatch->GetSession().IsConnected()))
{
if(!IOCPNetwork.Connect(m_lpSessionPolicy,
stServerInfo.szServerAddress, CServerSetup::DBAgentAdminToolServerListen))
{
ERRLOG2(g_Log, "서버 연결 실패. IP: %s/Port: %d",
stServerInfo.szServerAddress, CServerSetup::DBAgentAdminToolServerListen);
}
}
CGameDB* lpDBComponent = new CGameDB;
if (lpDBComponent->Connect(stServerInfo.szDBServer, stServerInfo.szDBName,
stServerInfo.szDBAccount, stServerInfo.szDBPass))
{
m_lpGameDB[dwServerGroup] = lpDBComponent;
}
else
{
delete lpDBComponent;
ERRLOG4(g_Log, "DB 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
stServerInfo.szDBServer, stServerInfo.szDBName,
stServerInfo.szDBAccount, stServerInfo.szDBPass);
}
}
}
void CAgentServerTable::ConnectToBillingDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szBillingDBServerBuffer[MAX_BUFFER];
char szBillingDBNameBuffer[MAX_BUFFER];
char szBillingDBAccountBuffer[MAX_BUFFER];
char szBillingDBPassBuffer[MAX_BUFFER];
const char* szBillingServer = ServerInfoTXT.GetValue("BILLING_DB_IP");
const char* szBillingName = ServerInfoTXT.GetValue("BILLING_DB_NAME");
const char* szBillingAccount = ServerInfoTXT.GetValue("BILLING_DB_ACCOUNT");
const char* szBillingPass = ServerInfoTXT.GetValue("BILLING_DB_PASS");
strncpy(szBillingDBServerBuffer, szBillingServer, MAX_BUFFER);
strncpy(szBillingDBNameBuffer, szBillingName, MAX_BUFFER);
strncpy(szBillingDBAccountBuffer, szBillingAccount, MAX_BUFFER);
strncpy(szBillingDBPassBuffer, szBillingPass, MAX_BUFFER);
szBillingDBServerBuffer[MAX_BUFFER - 1] = 0;
szBillingDBNameBuffer[MAX_BUFFER - 1] = 0;
szBillingDBAccountBuffer[MAX_BUFFER - 1] = 0;
szBillingDBPassBuffer[MAX_BUFFER - 1] = 0;
CBillingDB* lpBillingDB = new CBillingDB;
if(lpBillingDB->ConnectSQLServer(szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpBillingDB = lpBillingDB;
}
else
{
ERRLOG4(g_Log, "과금 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer);
m_lpBillingDB = NULL;
delete lpBillingDB;
}
}
void CAgentServerTable::ConnectToBillingLogDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szBillingDBServerBuffer[MAX_BUFFER];
char szBillingDBNameBuffer[MAX_BUFFER];
char szBillingDBAccountBuffer[MAX_BUFFER];
char szBillingDBPassBuffer[MAX_BUFFER];
const char* szBillingServer = ServerInfoTXT.GetValue("BILLING_LOG_DB_IP");
const char* szBillingName = ServerInfoTXT.GetValue("BILLING_LOG_DB_NAME");
const char* szBillingAccount = ServerInfoTXT.GetValue("BILLING_LOG_DB_ACCOUNT");
const char* szBillingPass = ServerInfoTXT.GetValue("BILLING_LOG_DB_PASS");
strncpy(szBillingDBServerBuffer, szBillingServer, MAX_BUFFER);
strncpy(szBillingDBNameBuffer, szBillingName, MAX_BUFFER);
strncpy(szBillingDBAccountBuffer, szBillingAccount, MAX_BUFFER);
strncpy(szBillingDBPassBuffer, szBillingPass, MAX_BUFFER);
szBillingDBServerBuffer[MAX_BUFFER - 1] = 0;
szBillingDBNameBuffer[MAX_BUFFER - 1] = 0;
szBillingDBAccountBuffer[MAX_BUFFER - 1] = 0;
szBillingDBPassBuffer[MAX_BUFFER - 1] = 0;
CBillingDB* lpBillingDB = new CBillingDB;
if(lpBillingDB->ConnectSQLServer(szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpBillingLogDB = lpBillingDB;
}
else
{
ERRLOG4(g_Log, "과금 로그 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szBillingDBServerBuffer, szBillingDBNameBuffer,
szBillingDBAccountBuffer, szBillingDBPassBuffer);
m_lpBillingLogDB = NULL;
delete lpBillingDB;
}
}
void CAgentServerTable::ConnectToAuthDB()
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return;
}
char szAuthDBServerBuffer[MAX_BUFFER];
char szAuthDBNameBuffer[MAX_BUFFER];
char szAuthDBAccountBuffer[MAX_BUFFER];
char szAuthDBPassBuffer[MAX_BUFFER];
const char* szAuthDBAddr = ServerInfoTXT.GetValue("AUTH_DB_IP");
const char* szAuthDBName = ServerInfoTXT.GetValue("AUTH_DB_NAME");
const char* szAuthDBAccount = ServerInfoTXT.GetValue("AUTH_DB_ACCOUNT");
const char* szAuthDBPass = ServerInfoTXT.GetValue("AUTH_DB_PASS");
strncpy(szAuthDBServerBuffer, szAuthDBAddr, MAX_BUFFER);
strncpy(szAuthDBNameBuffer, szAuthDBName, MAX_BUFFER);
strncpy(szAuthDBAccountBuffer, szAuthDBAccount, MAX_BUFFER);
strncpy(szAuthDBPassBuffer, szAuthDBPass, MAX_BUFFER);
szAuthDBServerBuffer[MAX_BUFFER - 1] = 0;
szAuthDBNameBuffer[MAX_BUFFER - 1] = 0;
szAuthDBAccountBuffer[MAX_BUFFER - 1] = 0;
szAuthDBPassBuffer[MAX_BUFFER - 1] = 0;
CAuthDB* lpAuthDB = new CAuthDB;
if (true == lpAuthDB->ConnectSQLServer(szAuthDBServerBuffer,
szAuthDBNameBuffer, szAuthDBAccountBuffer, szAuthDBPassBuffer, OleDB::ConnType_MSSQL))
{
m_lpAuthDB = lpAuthDB;
}
else
{
ERRLOG4(g_Log, "인증 디비 연결 실패. IP: %s/DBName: %s/DBAccount: %s/DBPass: %s",
szAuthDBServerBuffer, szAuthDBNameBuffer,
szAuthDBAccountBuffer, szAuthDBPassBuffer);
m_lpAuthDB = NULL;
delete lpAuthDB;
}
}
void CAgentServerTable::ConnectToAllAgentServerz(CIOCPNet& IOCPNetwork)
{
for(unsigned long dwServerGroup = 0; dwServerGroup < MAX_AGENT_SERVER; ++dwServerGroup)
{
ConnectToAgentServer(IOCPNetwork, dwServerGroup);
}
}
void CAgentServerTable::PrintServerState(char* szText, int length)
{
const int MAX_BUFFER = 256;
int nLength = 0;
char szServerNameBuffer[MAX_BUFFER]; // 그룹 명
char szServerAddressBuffer[MAX_BUFFER]; // 중계서버 IP
char szDBNameBuffer[MAX_BUFFER]; // 디비 명
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
nLength += _snprintf(szText + nLength, length - nLength, ">> NationType: %s\r\n", m_szNation);
nLength += _snprintf(szText + nLength, length - nLength, ">> DBAgentServer Connection State: \r\n");
for (unsigned long dwServerGroup = 0; dwServerGroup < MAX_AGENT_SERVER; ++dwServerGroup)
{
_snprintf(szServerNameBuffer, MAX_BUFFER, "SERVERGROUP_NAME_%02u", dwServerGroup);
_snprintf(szServerAddressBuffer, MAX_BUFFER, "AGENTSERVER_IP_%02u", dwServerGroup);
_snprintf(szDBNameBuffer, MAX_BUFFER, "GAME_DB_NAME_%02u", dwServerGroup);
const char* szServerName = ServerInfoTXT.GetValue(szServerNameBuffer);
const char* szServerAddress = ServerInfoTXT.GetValue(szServerAddressBuffer);
const char* szDBName = ServerInfoTXT.GetValue(szDBNameBuffer);
if((szServerName != NULL) && (szServerAddress != NULL) && (szDBName))
{
strncpy(szServerNameBuffer, szServerName, MAX_BUFFER);
strncpy(szServerAddressBuffer, szServerAddress,MAX_BUFFER);
strncpy(szDBNameBuffer, szDBName, MAX_BUFFER);
szServerNameBuffer[MAX_BUFFER - 1] = 0;
szServerAddressBuffer[MAX_BUFFER - 1] = 0;
szDBNameBuffer[MAX_BUFFER - 1] = 0;
GET_MULTI_DISPATCH(lpAgentDispatch, dwServerGroup,
CRylAgentServerDispatch, CRylAgentServerDispatch::GetDispatchTable());
CGameDB* lpGameDB = m_lpGameDB[dwServerGroup];
nLength += _snprintf(szText + nLength, length - nLength,
"[%02u] %15s : ", dwServerGroup, szServerNameBuffer);
if(NULL != lpAgentDispatch)
{
nLength += _snprintf(szText + nLength, length - nLength, "DBAgent Connected");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, "DBAgent Disconnected");
}
if(NULL != lpGameDB)
{
nLength += _snprintf(szText + nLength, length - nLength, " (DB Connected)\r\n");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, " (DB Disconnected)\r\n");
}
}
}
// 한국, 해외일 경우 각각 연결해야 하는 기타 DB 종류가 다름.
nLength += _snprintf(szText + nLength, length - nLength, "\r\n>> ETC Connection State: \r\n");
nLength += _snprintf(szText + nLength, length - nLength, "BillingDB Connection State:\t");
if(NULL != m_lpBillingDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected\r\n");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected\r\n");
if (0 == strcmp(m_szNation, "KOREA"))
{
nLength += _snprintf(szText + nLength, length - nLength, "BillingLogDB Connection State:\t");
if(NULL != m_lpBillingLogDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected");
}
else
{
nLength += _snprintf(szText + nLength, length - nLength, "AuthDB Connection State:\t");
if(NULL != m_lpAuthDB)
nLength += _snprintf(szText + nLength, length - nLength, "Connected\r\n");
else
nLength += _snprintf(szText + nLength, length - nLength, "Disconnected\r\n");
}
}
void CAgentServerTable::Disconnected(unsigned long dwIP)
{
m_IPtoServerID.erase(dwIP);
}
unsigned long CAgentServerTable::GetGroupFromDBAgentIP(unsigned long dwIP)
{
IPtoServerID::iterator pos = m_IPtoServerID.find(dwIP);
if(pos != m_IPtoServerID.end())
{
return pos->second;
}
return MAX_AGENT_SERVER;
}
bool CAgentServerTable::GetAgentServerInfo(unsigned long dwGroupIndex,
DBAgentServerInfo& stAgentServerInfo)
{
char szErrMessage[1024];
CServerInfo& ServerInfoTXT = CServerInfo::GetInstance();
if(!ServerInfoTXT.Reload())
{
_snprintf(szErrMessage, sizeof(szErrMessage),
"Failed To Load Server Script : Filename- %s", ServerInfoTXT.GetFileName());
MessageBox(NULL, szErrMessage, "Err", MB_OK);
return false;
}
char szServerNameKey[MAX_BUFFER]; // 해당 그룹명
char szServerAddressKey[MAX_BUFFER]; // 중계 서버 IP
char szDBServerKey[MAX_BUFFER]; // 게임 디비 IP
char szDBNameKey[MAX_BUFFER]; // 게임 디비 명
char szDBAccountKey[MAX_BUFFER]; // 게임 디비 계정
char szDBPassKey[MAX_BUFFER]; // 게임 디비 패스워드
_snprintf(szServerNameKey, MAX_BUFFER, "SERVERGROUP_NAME_%02u", dwGroupIndex);
_snprintf(szServerAddressKey, MAX_BUFFER, "AGENTSERVER_IP_%02u", dwGroupIndex);
_snprintf(szDBServerKey, MAX_BUFFER, "GAME_DB_IP_%02u", dwGroupIndex);
_snprintf(szDBNameKey, MAX_BUFFER, "GAME_DB_NAME_%02u", dwGroupIndex);
_snprintf(szDBAccountKey, MAX_BUFFER, "GAME_DB_ACCOUNT_%02u", dwGroupIndex);
_snprintf(szDBPassKey, MAX_BUFFER, "GAME_DB_PASS_%02u", dwGroupIndex);
const char* szServerNameBuffer = ServerInfoTXT.GetValue(szServerNameKey);
const char* szServerAddressBuffer = ServerInfoTXT.GetValue(szServerAddressKey);
const char* szDBServerBuffer = ServerInfoTXT.GetValue(szDBServerKey);
const char* szDBNameBuffer = ServerInfoTXT.GetValue(szDBNameKey);
const char* szDBAccountBuffer = ServerInfoTXT.GetValue(szDBAccountKey);
const char* szDBPassBuffer = ServerInfoTXT.GetValue(szDBPassKey);
if(szServerNameBuffer && szServerAddressBuffer
&& szDBServerBuffer && szDBNameBuffer
&& szDBAccountBuffer && szDBPassBuffer)
{
strncpy(stAgentServerInfo.szServerName, szServerNameBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szServerAddress, szServerAddressBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBServer, szDBServerBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBName, szDBNameBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBAccount, szDBAccountBuffer, MAX_BUFFER);
strncpy(stAgentServerInfo.szDBPass, szDBPassBuffer, MAX_BUFFER);
stAgentServerInfo.szServerName[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szServerAddress[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBServer[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBName[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBAccount[MAX_BUFFER - 1] = 0;
stAgentServerInfo.szDBPass[MAX_BUFFER - 1] = 0;
}
else
{
return false;
}
return true;
}
void CAgentServerTable::SetNULL(unsigned long dwServerGroup)
{
//m_lpAgentServerDispatch[dwServerGroup] = NULL;
}

View File

@@ -0,0 +1,86 @@
#ifndef _RYL_AGENTSERVER_TABLE_H_
#define _RYL_AGENTSERVER_TABLE_H_
#include <Pattern/Singleton.h>
#include <Network/Session/SessionPolicy.h>
class CSession;
class CRylAgentServerDispatch;
class CBuffer;
class CPacketDispatch;
class CGameDB;
class CServerRequestKeeper;
class CIOCPNet;
class CBillingDB;
class CAuthDB;
/*!
\class CAgentServerTable
운영서버와 연결중인 중계서버 연결 세션 테이블(과금DB, 인증DB, 게임DB도 관리)
*/
class CAgentServerTable : public CStaticSingleton<CAgentServerTable>
{
public:
enum SIZE
{
MAX_AGENT_SERVER = 10,
MAX_BUFFER = 256
};
struct DBAgentServerInfo
{
char szServerName[MAX_BUFFER];
char szServerAddress[MAX_BUFFER];
char szDBServer[MAX_BUFFER];
char szDBName[MAX_BUFFER];
char szDBAccount[MAX_BUFFER];
char szDBPass[MAX_BUFFER];
};
CAgentServerTable();
~CAgentServerTable();
void Destroy();
void InitAgentServerTable(CIOCPNet& IOCPNetwork);
void ConnectToAgentServer(CIOCPNet& IOCPNetwork, unsigned long dwGroupIndex);
void SetNULL(unsigned long dwServerGroup); // BaseLibrary 업데이트 이후 필요없음;
void PrintServerState(char* szText, int length);
void RemoveAllModifyCharacter(CPacketDispatch* lpPacketDispatch); // 해당 Dispatch의 캐릭터들을 목록에서 전부 삭제
void RemoveAllDepositLock(CPacketDispatch* lpPacketDispatch); // 해당 Dispatch의 창고정보를 목록에서 전부 삭제
void Disconnected(unsigned long dwIP); // 임의 접속 끊기
unsigned long GetGroupFromDBAgentIP(unsigned long dwIP);
CServerRequestKeeper& GetRequestKeeper(unsigned long dwServerGroup);// RequestKeeper 얻기
CRylAgentServerDispatch* GetDispatch(unsigned long dwServerID); // 중계서버 디스패치 얻기
CSession* GetSession(unsigned long dwServerID); // 중계서버 세션 얻기
CGameDB* GetGameDB(unsigned long dwServerID); // 게임 DB 얻기
CBillingDB* GetBillingDB() { return m_lpBillingDB; } // 과금 DB 얻기
CBillingDB* GetBillingLogDB() { return m_lpBillingLogDB; } // 과금 Log DB 얻기
CAuthDB* GetAuthDB() { return m_lpAuthDB; } // 인증 DB 얻기
private:
CSessionPolicy* m_lpSessionPolicy;
typedef std::map<unsigned long, unsigned long> IPtoServerID;
IPtoServerID m_IPtoServerID;
CGameDB* m_lpGameDB[MAX_AGENT_SERVER];
CBillingDB* m_lpBillingDB;
CBillingDB* m_lpBillingLogDB;
CAuthDB* m_lpAuthDB;
char m_szNation[MAX_BUFFER];
void ConnectToAllAgentServerz(CIOCPNet& IOCPNetwork); // 스크립트의 중계서버 리스트로 연결
void ConnectToBillingDB(); // 과금 DB 연결
void ConnectToBillingLogDB(); // 과금 Log DB 연결
void ConnectToAuthDB(); // 인증 DB 연결
bool GetAgentServerInfo(unsigned long dwGroupIndex, DBAgentServerInfo& stAgentServerInfo);
};
#endif

View File

@@ -0,0 +1,78 @@
#include "stdafx.h"
#include "RYL_ServerRequestKeeper.h"
#include <Network/Session/Session.h>
#include <Network/Dispatch/Dispatch.h>
CServerRequestKeeper::CServerRequestKeeper()
: m_RequestKey(0)
{
}
CServerRequestKeeper::~CServerRequestKeeper()
{
CCSLock::Syncronize sync(m_RequestMapLock);
m_RequestMap.clear();
}
unsigned long CServerRequestKeeper::Push(CPacketDispatch* lpPacketDispatch, unsigned long dwClientRequest)
{
CCSLock::Syncronize sync(m_RequestMapLock);
m_RequestMap.insert(std::make_pair(++m_RequestKey, RequestInfo(dwClientRequest, lpPacketDispatch)));
return m_RequestKey;
}
bool CServerRequestKeeper::Pop(unsigned long dwRequestKey)
{
CCSLock::Syncronize sync(m_RequestMapLock);
std::pair<isMapReqMap::iterator, isMapReqMap::iterator> itrs = m_RequestMap.equal_range(dwRequestKey);
for(; itrs.first != itrs.second; ++itrs.first)
{
m_RequestMap.erase(itrs.first);
return true;
}
return false;
}
bool CServerRequestKeeper::GetRequest(unsigned long dwRequestKey, CServerRequestKeeper::RequestInfo& Out_Info)
{
CCSLock::Syncronize sync(m_RequestMapLock);
std::pair<isMapReqMap::iterator, isMapReqMap::iterator> itrs = m_RequestMap.equal_range(dwRequestKey);
for(; itrs.first != itrs.second; ++itrs.first)
{
Out_Info = itrs.first->second;
return true;
}
return false;
}
// 해당 ClientDispatch가 소멸했을경우를 대비하여 소멸자에 이녀석을 추가시켜놓자...
void CServerRequestKeeper::RemoveAllSelectDispatch(CPacketDispatch* lpPacketDispatch)
{
CCSLock::Syncronize sync(m_RequestMapLock);
isMapReqMap::iterator itr = m_RequestMap.begin();
for(; itr != m_RequestMap.end(); )
{
RequestInfo& Info = itr->second;
if(lpPacketDispatch == Info.m_lpPacketDispatch)
{
m_RequestMap.erase(itr++);
}
else
{
++itr;
}
}
}

View File

@@ -0,0 +1,45 @@
#ifndef _RYL_SERVER_REQUEST_KEEPER_H_
#define _RYL_SERVER_REQUEST_KEEPER_H_
#include <Thread/Lock.h>
class CPacketDispatch;
// 서버간 통신시 보낸 패킷 정보를 보관 (현재 의미가 없으나 패킷Ack관리를 해야함)
class CServerRequestKeeper
{
public:
// Request패킷 기본 구조체
struct RequestInfo
{
unsigned long m_dwClientRequest;
CPacketDispatch* m_lpPacketDispatch;
RequestInfo(unsigned long dwClientRequest, CPacketDispatch* lpPakcetDispatch)
: m_dwClientRequest(dwClientRequest)
, m_lpPacketDispatch(lpPakcetDispatch) {}
RequestInfo()
: m_dwClientRequest(0)
, m_lpPacketDispatch(NULL) {}
};
public:
CServerRequestKeeper();
~CServerRequestKeeper();
unsigned long Push(CPacketDispatch* lpPacketDispatch, unsigned long dwClientRequest);
bool Pop(unsigned long dwRequestKey);
void RemoveAllSelectDispatch(CPacketDispatch* lpPacketDispatch); // Param으로 들어온 Dispatch인것들은 목록에서 전부 삭제
bool GetRequest(unsigned long dwRequestKey, RequestInfo& Out_Info); // Request정보 가져오기
private:
typedef std::map<unsigned long, RequestInfo> isMapReqMap;
isMapReqMap m_RequestMap;
unsigned long m_RequestKey;
CCSLock m_RequestMapLock;
};
#endif

View File

@@ -0,0 +1,113 @@
#include <RYL_AdminManagerServer.h>
#include <Parser/ServerInfo.h>
#include <Utility/ServerAppFrameWork/ConsoleWindow/ConsoleCMDFactory.h>
#include <Log/ServerLog.h>
#include "RYL_AgentServerTable.h"
// 로그 출력 "flush"
class CCMDFlush : public CConsoleCMDSingleton<CCMDFlush>
{
protected:
virtual bool DoProcess()
{
SERLOG0(g_Log, "Execute console command: flush");
g_Log.Flush();
CRylAdminManagerServer::GetInstance().PrintOutput("Log flush complete", 0);
return true;
}
};
// 스크립트 파일 다시 로드하기 "reload_script"
class CCMDReload : public CConsoleCMDSingleton<CCMDReload>
{
virtual bool DoProcess()
{
SERLOG0(g_Log, "Execute console command: reload_script");
if(!CServerInfo::GetInstance().Reload())
{
CRylAdminManagerServer::GetInstance().PrintOutput("Script load failed", 0);
return false;
}
CRylAdminManagerServer::GetInstance().PrintOutput("Script load success", 0);
return true;
}
};
// 서버군 전부 다시 재접속시도 "connect_all"
class CCMDConnectAll : public CConsoleCMDSingleton<CCMDConnectAll>
{
virtual bool DoProcess()
{
SERLOG0(g_Log, "Execute console command: connect all");
CAgentServerTable::GetInstance().InitAgentServerTable(
*CRylAdminManagerServer::GetInstance().GetIOCPNet());
CRylAdminManagerServer::GetInstance().PrintOutput("Execute command: connect all", 0);
return true;
}
};
// 특정 서버군 접속 시도 커맨드 "connect_index %d"
class CCMDConnect : public CConsoleCommand
{
protected:
virtual CConsoleCommand* Clone(const TCHAR* szCommand, size_t nCommandLength)
{
CCMDConnect* lpCommand = new CCMDConnect;
if(0 != lpCommand)
{
lpCommand->m_dwServerGroupID = 0;
const int MAX_COMMAND = 1024;
char szLocalCommand[MAX_COMMAND];
_snprintf(szLocalCommand, MAX_COMMAND - 1, "%s", szCommand);
szLocalCommand[MAX_COMMAND - 1] = 0;
char* token = strtok(szLocalCommand, "\r\n\t ");
if(0 != token)
{
token = strtok(0, "\r\n\t ");
if(0 != token)
{
lpCommand->m_dwServerGroupID = atol(token);
}
}
}
return lpCommand;
}
virtual bool DoProcess()
{
SERLOG1(g_Log, "Execute command: connect_index %d", m_dwServerGroupID);
CAgentServerTable::GetInstance().ConnectToAgentServer(
*CRylAdminManagerServer::GetInstance().GetIOCPNet(), m_dwServerGroupID);
const char* szText = "Execute command: connect_index";
CRylAdminManagerServer::GetInstance().PrintOutput(
szText, static_cast<int>(strlen(szText)));
return true;
}
virtual bool Destroy()
{
delete this;
return true;
}
private:
unsigned long m_dwServerGroupID;
};

View File

@@ -0,0 +1,24 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by AdminManagerServer.rc
//
#define IDR_MENU_POPUP 4
#define IDI_ICON1 109
#define IDI_TRAY_ICON 109
#define ID_MENU_CONSOL 40001
#define ID_CONSOL_OPENCONSOLE 40002
#define ID_CONSOLE_CLOSECONSOLE 40003
#define ID_QUIT 40005
#define ID_FLUSH 40007
#define ID_CONNECTALL 40009
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 110
#define _APS_NEXT_COMMAND_VALUE 40010
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -0,0 +1,96 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#pragma warning(disable:4800)
// 각종 점검용 정의들. 사용하지 않을 경우는 (void*)0 로 대신할 것.
#ifdef _DEBUG
#define PERFORMANCE_CHECK(x) x
#else
#define PERFORMANCE_CHECK(x) x
#endif
#ifdef _DEBUG
#define DEBUG_CRT_MEMORY(x) x
#else
#define DEBUG_CRT_MEMORY(x) (void*)0
#endif
// Windows Header Files:
//#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
/*
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소
#include <afxext.h> // MFC 익스텐션
#include <afxdisp.h> // MFC 자동화 클래스
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxdlgs.h>
*/
// 소켓 관련 헤더들
#include <winsock2.h>
#include <mswsock.h>
#include <iphlpapi.h> // for IP Help functions, that gets local IP address
#include <ws2tcpip.h> // tcp/ip specific options
#include <wsipx.h> // for IPX/SPX
#include <wsnwlink.h>
// DB관련 헤더들
#include <msdasc.h> // OLE DB Service Component header
#include <msdaguid.h> // OLE DB Root Enumerator
#include <msdasql.h> // MSDASQL - Default provider
#include <sqloledb.h> // MS SQL
// 기본 헤더들
#include <windows.h>
#include <process.h>
#include <shellapi.h>
#include <tchar.h>
// C 함수 헤더들
#include <cassert>
#include <ctime>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdarg>
#include <cstddef>
#include <cstdlib>
// STL 헤더들
#include <new>
#include <set>
#include <map>
#include <hash_map>
#include <vector>
#include <list>
#include <string>
#include <limits>
#include <bitset>
#include <complex>
#include <algorithm>
#include <numeric>
#include <utility>
#include <functional>