Files
2022-10-26 12:25:11 +08:00

176 lines
6.8 KiB
C++

#pragma once
#ifndef WORLDSERVER_FRIEND_INVITIATION_H
#define WORLDSERVER_FRIEND_INVITIATION_H
/*
작성자: 문상현
제작일: 2009-10-28
간단한설명: 썬의 친구 초대 이벤트를 지원하기 위한 컨트롤러 클래스 (월드 서버용)
@history
- 2011.09.08, waverix, migrated to the renewal world server
*/
#include "Services/Friends/FriendMap.h"
//#include <FriendInvitation/FriendInvitationController.h>
//#include "ns_world::WorldUser.h"
//#include "FriendInvitationListProc.h"
//#include "FriendInvitationLevelChangedProc.h"
class FriendInvitationController;
//class FriendInvitationListProc;
class FriendInvitationLevelChangedProc;
//==================================================================================================
namespace ns_functor {
;
}; //end of namespace
//==================================================================================================
namespace ns_world {
;
struct FriendInvitationNotificationEventArg
{
bool need_to_send_to_agent;
bool need_to_send_to_client;
INVITATEFRIENDLIST_INFO::FRIEND_ACTION control_action;
};
class FriendInvitationInWorld// : public FriendInvitationController
{
public:
enum eMsgForward {
eMsgForward_Undefined = 0,
eMsgForward_ToAgent = 0x01, // NOTE: migrated from SEND_AGENTSERVER
eMsgForward_ToClient = 0x02, // NOTE: migrated from SEND_CLIENT
//
eMsgForward_Counts
};
//
static FriendInvitationInWorld* Instance();
void StartService(); // call it on prepared service
//친구추천관계의 친구가 생성되었을때
void OnAddInvitatedFriendCMD(ns_world::ServerSessionInWorld* const server_session,
const MSG_AW_FRIEND_INVITATIONR_INSERT_CMD* const recv_msg, const WORD msg_size);
//유저가 레벨업 했을때
void OnCharacterLevelUp(ns_world::ServerSessionInWorld* const server_session,
const MSG_AW_USER_LEVELUP_CMD* const recv_msg, const WORD msg_size);
//친구목록을 삭제 했을때
void OnFriendRemove(ns_world::ServerSessionInWorld* const server_session,
const MSG_DW_FRIEND_DEL_ACK* const recv_msg, const WORD msg_size);
//친구가 차단 했을때
void OnFriendBlock(ns_world::ServerSessionInWorld* const server_session,
const MSG_DW_FRIEND_BLOCK_ACK* const recv_msg, const WORD msg_size);
//
//친구 목록을 저장할때 친구초대 목록도 같이 저장한다.
void OnAddFriend(STRUCT_FRIEND_INFO& friend_info,
const STRUCT_FRIEND_DB_INFO& friend_info_from_db, ns_world::WorldUser* user);
//에이전트 서버에 친구추천 목록을 전달한다.
void NotifyTotalFriendInvitationList(ns_world::WorldUser* user, eMsgForward forwarding_flags);
// 친구 상태 코드를 반환한다.
// returns: STRUCT_FRIEND_DB_INFO::enumeration
BYTE GetFriendSts(ns_world::WorldUser* user, DWORD friend_char_guid);
protected:
private:
struct ChangeEvent; // NOTE: migrated from FriendInvitationLevelChangedProc
typedef ns_world::FriendMap::FRIEND_INFO_MAP FRIEND_INFO_MAP;
typedef ns_world::FriendMap::FRIEND_TABLE FRIEND_TABLE;
//
FriendInvitationInWorld();
virtual ~FriendInvitationInWorld();
static FriendInvitationInWorld* CreateInstance();
//
void RegisterCharStatusDataNodeAccessor(ICharStatusDataNodeAccessor* accessor);
void PrepareFriendInvitationTable(ns_world::WorldUser* user);
bool UpdateFriendInvitationInfo(ns_world::WorldUser* user,
FRIEND_TABLE* const link_table, const STRUCT_FRIEND_INFO& friend_info);
void ReleaseFriendInvitationTable(ns_world::WorldUser* user);
//친구 관계를 해제 한다.
void ReleaseFriendInvitationRelation(CHARGUID from_char_guid, CHARGUID to_char_guid);
// migrated from 'FriendInvitationListProc' = {
// // custom interface -> renewal interface
// IsSetFriendsNormalSts,
// RemoveInvitateFriend, // -> ProcessFriendInvitationRelationDeletionEvent
// SendInvitateFriendList, -> NotifyPartialFriendInvitationList
// SendInvitateFriendList (polymorphism), NotifyPreparedFriendInvitationList
// GetInvitateFriendList, -> LoadFriendInvitationRelationList
// GetInvitateFriendList (polymorphism) -> MakeInitializedFriendInvitationNode
// }
//나한테 속한 모든 친구 추천관계를 일반 친구 관계로 변경한다.
bool IsSetFriendsNormalSts(ns_world::WorldUser* user);
//친구추천 리스트에서 삭제하고 결과를 서버에 전송한다.
void ProcessFriendInvitationRelationDeletionEvent(
ns_world::WorldUser* user,
STRUCT_FRIEND_DB_INFO::eNodeType selected_invitation_type,
DWORD related_char_guid);
//에이전트 서버에 친구추천 목록을 전달한다. (W->A->G)
void NotifyPartialFriendInvitationList(
STRUCT_FRIEND_DB_INFO::eNodeType invitation_type, // = { INFO_INVIAT(5), INFO_BEINVIATED(6) }
ns_world::WorldUser* user,
INVITATEFRIENDLIST_INFO::FRIEND_ACTION action,
eMsgForward forwarding_flags) const;
void NotifyPreparedFriendInvitationList(
ns_world::WorldUser* user,
const INVITATEFRIENDLIST_INFO& friend_list,
INVITATEFRIENDLIST_INFO::FRIEND_ACTION action,
eMsgForward forwarding_flags) const;
// NOTE: migrated from GetInvitateFriendList
bool LoadFriendInvitationRelationList(
ns_world::WorldUser* user,
STRUCT_FRIEND_DB_INFO::eNodeType selected_invitation_type,
INVITATEFRIENDLIST_INFO* const result_list) const;
//전송할 패킷을 만든다.
//void GetInvitateFriendList(
// STRUCT_FRIEND_DB_INFO::eNodeType SetType,
// ns_world::WorldUser* user,
// INVITATEFRIENDLIST_INFO& FriendList);
// NOTE: the custom interface 'GetInvitateFriendList'... unused section
void MakeInitializedFriendInvitationNode(
STRUCT_FRIEND_DB_INFO::eNodeType invitation_type, // = { INFO_INVIAT(5), INFO_BEINVIATED(6) }
ns_world::WorldUser* user,
INVITATEFRIENDLIST_INFO* const result_node,
DWORD invited_char_guid) const;
//
// fields...
FriendInvitationInWorld* redirected_this_; // redirecting
ns_world::ICharStatusDataNodeAccessor* char_status_data_accessor_;
FriendInvitationController* inter_controller_; // dummy to compatible custom logic
//FriendInvitationLevelChangedProc* LevelChangedProc;
FRIEND_TABLE inviting_friend_table_;
FRIEND_TABLE observer_friend_table_;
//
static FriendInvitationInWorld* instance_static_;
//
friend struct FriendInvitationInWorld::ChangeEvent;
friend class ns_world::FriendMap;
friend class ns_world::WorldUserManager;
__DISABLE_COPY(FriendInvitationInWorld);
};
}; //end of namespace
//==================================================================================================
inline ns_world::FriendInvitationInWorld* ns_world::FriendInvitationInWorld::Instance()
{
if (instance_static_ != NULL) {
return instance_static_;
}
return CreateInstance();
}
#endif //WORLDSERVER_FRIEND_INVITIATION_H