346 lines
12 KiB
Go
346 lines
12 KiB
Go
package guilds
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// GuildDatabase defines database operations for guilds
|
|
type GuildDatabase interface {
|
|
// LoadGuilds retrieves all guilds from database
|
|
LoadGuilds(ctx context.Context) ([]GuildData, error)
|
|
|
|
// LoadGuild retrieves a specific guild from database
|
|
LoadGuild(ctx context.Context, guildID int32) (*GuildData, error)
|
|
|
|
// LoadGuildMembers retrieves all members for a guild
|
|
LoadGuildMembers(ctx context.Context, guildID int32) ([]GuildMemberData, error)
|
|
|
|
// LoadGuildEvents retrieves events for a guild
|
|
LoadGuildEvents(ctx context.Context, guildID int32) ([]GuildEventData, error)
|
|
|
|
// LoadGuildRanks retrieves custom rank names for a guild
|
|
LoadGuildRanks(ctx context.Context, guildID int32) ([]GuildRankData, error)
|
|
|
|
// LoadGuildPermissions retrieves permissions for a guild
|
|
LoadGuildPermissions(ctx context.Context, guildID int32) ([]GuildPermissionData, error)
|
|
|
|
// LoadGuildEventFilters retrieves event filters for a guild
|
|
LoadGuildEventFilters(ctx context.Context, guildID int32) ([]GuildEventFilterData, error)
|
|
|
|
// LoadGuildRecruiting retrieves recruiting settings for a guild
|
|
LoadGuildRecruiting(ctx context.Context, guildID int32) ([]GuildRecruitingData, error)
|
|
|
|
// LoadPointHistory retrieves point history for a member
|
|
LoadPointHistory(ctx context.Context, characterID int32) ([]PointHistoryData, error)
|
|
|
|
// SaveGuild saves guild basic data
|
|
SaveGuild(ctx context.Context, guild *Guild) error
|
|
|
|
// SaveGuildMembers saves all guild members
|
|
SaveGuildMembers(ctx context.Context, guildID int32, members []*GuildMember) error
|
|
|
|
// SaveGuildEvents saves guild events
|
|
SaveGuildEvents(ctx context.Context, guildID int32, events []GuildEvent) error
|
|
|
|
// SaveGuildRanks saves guild rank names
|
|
SaveGuildRanks(ctx context.Context, guildID int32, ranks map[int8]string) error
|
|
|
|
// SaveGuildPermissions saves guild permissions
|
|
SaveGuildPermissions(ctx context.Context, guildID int32, permissions map[int8]map[int8]int8) error
|
|
|
|
// SaveGuildEventFilters saves guild event filters
|
|
SaveGuildEventFilters(ctx context.Context, guildID int32, filters map[int8]map[int8]int8) error
|
|
|
|
// SaveGuildRecruiting saves guild recruiting settings
|
|
SaveGuildRecruiting(ctx context.Context, guildID int32, flags, descTags map[int8]int8) error
|
|
|
|
// SavePointHistory saves point history for a member
|
|
SavePointHistory(ctx context.Context, characterID int32, history []PointHistory) error
|
|
|
|
// GetGuildIDByCharacterID returns guild ID for a character
|
|
GetGuildIDByCharacterID(ctx context.Context, characterID int32) (int32, error)
|
|
|
|
// CreateGuild creates a new guild
|
|
CreateGuild(ctx context.Context, guildData GuildData) (int32, error)
|
|
|
|
// DeleteGuild removes a guild and all related data
|
|
DeleteGuild(ctx context.Context, guildID int32) error
|
|
|
|
// GetNextGuildID returns the next available guild ID
|
|
GetNextGuildID(ctx context.Context) (int32, error)
|
|
|
|
// GetNextEventID returns the next available event ID for a guild
|
|
GetNextEventID(ctx context.Context, guildID int32) (int64, error)
|
|
}
|
|
|
|
// ClientManager handles client communication for guilds
|
|
type ClientManager interface {
|
|
// SendGuildUpdate sends guild information update to client
|
|
SendGuildUpdate(characterID int32, guild *Guild) error
|
|
|
|
// SendGuildMemberList sends guild member list to client
|
|
SendGuildMemberList(characterID int32, members []MemberInfo) error
|
|
|
|
// SendGuildMember sends single member info to client
|
|
SendGuildMember(characterID int32, member *GuildMember) error
|
|
|
|
// SendGuildMOTD sends message of the day to client
|
|
SendGuildMOTD(characterID int32, motd string) error
|
|
|
|
// SendGuildEvent sends guild event to client
|
|
SendGuildEvent(characterID int32, event *GuildEvent) error
|
|
|
|
// SendGuildEventList sends guild event list to client
|
|
SendGuildEventList(characterID int32, events []GuildEventInfo) error
|
|
|
|
// SendGuildChatMessage sends guild chat message to client
|
|
SendGuildChatMessage(characterID int32, senderName, message string, language int8) error
|
|
|
|
// SendOfficerChatMessage sends officer chat message to client
|
|
SendOfficerChatMessage(characterID int32, senderName, message string, language int8) error
|
|
|
|
// SendGuildInvite sends guild invitation to client
|
|
SendGuildInvite(characterID int32, invite GuildInvite) error
|
|
|
|
// SendGuildRecruitingInfo sends recruiting information to client
|
|
SendGuildRecruitingInfo(characterID int32, info RecruitingInfo) error
|
|
|
|
// SendGuildPermissions sends guild permissions to client
|
|
SendGuildPermissions(characterID int32, permissions map[int8]map[int8]int8) error
|
|
|
|
// IsClientOnline checks if a character is currently online
|
|
IsClientOnline(characterID int32) bool
|
|
|
|
// GetClientLanguage returns the language setting for a client
|
|
GetClientLanguage(characterID int32) int8
|
|
}
|
|
|
|
// PlayerManager provides player information for guilds
|
|
type PlayerManager interface {
|
|
// GetPlayerInfo retrieves basic player information
|
|
GetPlayerInfo(characterID int32) (PlayerInfo, error)
|
|
|
|
// IsPlayerOnline checks if a player is currently online
|
|
IsPlayerOnline(characterID int32) bool
|
|
|
|
// GetPlayerZone returns the current zone for a player
|
|
GetPlayerZone(characterID int32) string
|
|
|
|
// GetPlayerLevel returns player's current level
|
|
GetPlayerLevel(characterID int32) (int8, int8) // adventure, tradeskill
|
|
|
|
// GetPlayerClass returns player's current class
|
|
GetPlayerClass(characterID int32) (int8, int8) // adventure, tradeskill
|
|
|
|
// GetPlayerName returns player's character name
|
|
GetPlayerName(characterID int32) string
|
|
|
|
// ValidatePlayerExists checks if a player exists
|
|
ValidatePlayerExists(characterName string) (int32, error)
|
|
|
|
// GetAccountID returns the account ID for a character
|
|
GetAccountID(characterID int32) int32
|
|
}
|
|
|
|
// GuildEventHandler handles guild-related events
|
|
type GuildEventHandler interface {
|
|
// OnGuildCreated called when a guild is created
|
|
OnGuildCreated(guild *Guild)
|
|
|
|
// OnGuildDeleted called when a guild is deleted
|
|
OnGuildDeleted(guildID int32, guildName string)
|
|
|
|
// OnMemberJoined called when a member joins a guild
|
|
OnMemberJoined(guild *Guild, member *GuildMember, inviterName string)
|
|
|
|
// OnMemberLeft called when a member leaves a guild
|
|
OnMemberLeft(guild *Guild, member *GuildMember, reason string)
|
|
|
|
// OnMemberPromoted called when a member is promoted
|
|
OnMemberPromoted(guild *Guild, member *GuildMember, oldRank, newRank int8, promoterName string)
|
|
|
|
// OnMemberDemoted called when a member is demoted
|
|
OnMemberDemoted(guild *Guild, member *GuildMember, oldRank, newRank int8, demoterName string)
|
|
|
|
// OnPointsAwarded called when points are awarded to members
|
|
OnPointsAwarded(guild *Guild, members []int32, points float64, comment, awardedBy string)
|
|
|
|
// OnGuildEvent called when a guild event occurs
|
|
OnGuildEvent(guild *Guild, event *GuildEvent)
|
|
|
|
// OnGuildLevelUp called when a guild levels up
|
|
OnGuildLevelUp(guild *Guild, oldLevel, newLevel int8)
|
|
|
|
// OnGuildChatMessage called when a guild chat message is sent
|
|
OnGuildChatMessage(guild *Guild, senderID int32, senderName, message string, language int8)
|
|
|
|
// OnOfficerChatMessage called when an officer chat message is sent
|
|
OnOfficerChatMessage(guild *Guild, senderID int32, senderName, message string, language int8)
|
|
}
|
|
|
|
// LogHandler provides logging functionality
|
|
type LogHandler interface {
|
|
// LogDebug logs debug messages
|
|
LogDebug(category, message string, args ...any)
|
|
|
|
// LogInfo logs informational messages
|
|
LogInfo(category, message string, args ...any)
|
|
|
|
// LogError logs error messages
|
|
LogError(category, message string, args ...any)
|
|
|
|
// LogWarning logs warning messages
|
|
LogWarning(category, message string, args ...any)
|
|
}
|
|
|
|
// PlayerInfo contains basic player information
|
|
type PlayerInfo struct {
|
|
CharacterID int32 `json:"character_id"`
|
|
CharacterName string `json:"character_name"`
|
|
AccountID int32 `json:"account_id"`
|
|
AdventureLevel int8 `json:"adventure_level"`
|
|
AdventureClass int8 `json:"adventure_class"`
|
|
TradeskillLevel int8 `json:"tradeskill_level"`
|
|
TradeskillClass int8 `json:"tradeskill_class"`
|
|
Zone string `json:"zone"`
|
|
IsOnline bool `json:"is_online"`
|
|
LastLogin time.Time `json:"last_login"`
|
|
}
|
|
|
|
// GuildAware interface for entities that can participate in guilds
|
|
type GuildAware interface {
|
|
GetCharacterID() int32
|
|
GetGuildID() int32
|
|
GetGuildRank() int8
|
|
IsInGuild() bool
|
|
HasGuildPermission(permission int8) bool
|
|
}
|
|
|
|
// EntityGuildAdapter adapts entities to work with guild system
|
|
type EntityGuildAdapter struct {
|
|
entity interface {
|
|
GetID() int32
|
|
// Add other entity methods as needed
|
|
}
|
|
guildManager *GuildManager
|
|
}
|
|
|
|
// GetCharacterID returns the character ID from the adapted entity
|
|
func (a *EntityGuildAdapter) GetCharacterID() int32 {
|
|
return a.entity.GetID()
|
|
}
|
|
|
|
// GetGuildID returns the guild ID for the character
|
|
func (a *EntityGuildAdapter) GetGuildID() int32 {
|
|
// TODO: Implement guild lookup through guild manager
|
|
return 0
|
|
}
|
|
|
|
// GetGuildRank returns the guild rank for the character
|
|
func (a *EntityGuildAdapter) GetGuildRank() int8 {
|
|
// TODO: Implement rank lookup through guild manager
|
|
return RankRecruit
|
|
}
|
|
|
|
// IsInGuild checks if the character is in a guild
|
|
func (a *EntityGuildAdapter) IsInGuild() bool {
|
|
return a.GetGuildID() > 0
|
|
}
|
|
|
|
// HasGuildPermission checks if the character has a specific guild permission
|
|
func (a *EntityGuildAdapter) HasGuildPermission(permission int8) bool {
|
|
// TODO: Implement permission checking through guild manager
|
|
return false
|
|
}
|
|
|
|
// InviteManager handles guild invitations
|
|
type InviteManager interface {
|
|
// SendInvite sends a guild invitation
|
|
SendInvite(guildID, characterID, inviterID int32, rank int8) error
|
|
|
|
// AcceptInvite accepts a guild invitation
|
|
AcceptInvite(characterID, guildID int32) error
|
|
|
|
// DeclineInvite declines a guild invitation
|
|
DeclineInvite(characterID, guildID int32) error
|
|
|
|
// GetPendingInvites returns pending invites for a character
|
|
GetPendingInvites(characterID int32) ([]GuildInvite, error)
|
|
|
|
// ClearExpiredInvites removes expired invitations
|
|
ClearExpiredInvites() error
|
|
}
|
|
|
|
// PermissionChecker provides permission validation
|
|
type PermissionChecker interface {
|
|
// CanInvite checks if a member can invite players
|
|
CanInvite(guild *Guild, memberRank int8) bool
|
|
|
|
// CanRemoveMember checks if a member can remove other members
|
|
CanRemoveMember(guild *Guild, memberRank, targetRank int8) bool
|
|
|
|
// CanPromote checks if a member can promote other members
|
|
CanPromote(guild *Guild, memberRank, targetRank int8) bool
|
|
|
|
// CanDemote checks if a member can demote other members
|
|
CanDemote(guild *Guild, memberRank, targetRank int8) bool
|
|
|
|
// CanEditPermissions checks if a member can edit guild permissions
|
|
CanEditPermissions(guild *Guild, memberRank int8) bool
|
|
|
|
// CanUseBankSlot checks if a member can access a specific bank slot
|
|
CanUseBankSlot(guild *Guild, memberRank int8, bankSlot int, action string) bool
|
|
|
|
// CanSpeakInOfficerChat checks if a member can speak in officer chat
|
|
CanSpeakInOfficerChat(guild *Guild, memberRank int8) bool
|
|
|
|
// CanAssignPoints checks if a member can assign guild points
|
|
CanAssignPoints(guild *Guild, memberRank int8) bool
|
|
}
|
|
|
|
// NotificationManager handles guild notifications
|
|
type NotificationManager interface {
|
|
// NotifyMemberLogin notifies guild of member login
|
|
NotifyMemberLogin(guild *Guild, member *GuildMember)
|
|
|
|
// NotifyMemberLogout notifies guild of member logout
|
|
NotifyMemberLogout(guild *Guild, member *GuildMember)
|
|
|
|
// NotifyGuildMessage sends a message to all guild members
|
|
NotifyGuildMessage(guild *Guild, eventType int8, message string, args ...any)
|
|
|
|
// NotifyOfficers sends a message to officers only
|
|
NotifyOfficers(guild *Guild, message string, args ...any)
|
|
|
|
// NotifyGuildUpdate notifies guild members of guild changes
|
|
NotifyGuildUpdate(guild *Guild)
|
|
}
|
|
|
|
// BankManager handles guild bank operations
|
|
type BankManager interface {
|
|
// GetBankContents returns contents of a guild bank
|
|
GetBankContents(guildID int32, bankSlot int) ([]BankItem, error)
|
|
|
|
// DepositItem deposits an item into guild bank
|
|
DepositItem(guildID int32, bankSlot int, item BankItem, depositorID int32) error
|
|
|
|
// WithdrawItem withdraws an item from guild bank
|
|
WithdrawItem(guildID int32, bankSlot int, itemSlot int, withdrawerID int32) error
|
|
|
|
// LogBankEvent logs a bank event
|
|
LogBankEvent(guildID int32, bankSlot int, eventType int32, description string) error
|
|
|
|
// GetBankEventHistory returns bank event history
|
|
GetBankEventHistory(guildID int32, bankSlot int) ([]GuildBankEvent, error)
|
|
}
|
|
|
|
// BankItem represents an item in the guild bank
|
|
type BankItem struct {
|
|
Slot int `json:"slot"`
|
|
ItemID int32 `json:"item_id"`
|
|
Quantity int32 `json:"quantity"`
|
|
DepositorID int32 `json:"depositor_id"`
|
|
DepositDate time.Time `json:"deposit_date"`
|
|
}
|