2022-10-03 05:19:33 +00:00
|
|
|
package domain
|
|
|
|
|
2022-10-09 08:19:31 +00:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
)
|
2022-10-03 05:19:33 +00:00
|
|
|
|
|
|
|
type Group struct {
|
2022-10-11 05:05:35 +00:00
|
|
|
ID string
|
|
|
|
ServerID string // Discord server ID
|
|
|
|
ChannelGains string
|
|
|
|
ChannelLosses string
|
2022-10-28 11:59:20 +00:00
|
|
|
Internals bool // Show conquers in the same group
|
|
|
|
Barbarians bool // Show barbarian conquers
|
2023-06-27 12:00:35 +00:00
|
|
|
ServerKey string // TW server key (e.g. en130)
|
2022-10-11 05:05:35 +00:00
|
|
|
VersionCode string
|
2023-06-30 05:09:52 +00:00
|
|
|
LanguageTag string // BCP 47 language tag
|
2022-10-11 05:05:35 +00:00
|
|
|
CreatedAt time.Time
|
2022-10-03 05:19:33 +00:00
|
|
|
}
|
|
|
|
|
2023-06-18 06:47:51 +00:00
|
|
|
type GroupWithMonitors struct {
|
|
|
|
Group
|
|
|
|
|
|
|
|
Monitors []Monitor
|
|
|
|
}
|
|
|
|
|
2023-07-09 05:44:35 +00:00
|
|
|
func (g GroupWithMonitors) CanSendEnnoblementNotificationTypeGain(e Ennoblement) bool {
|
|
|
|
if g.ChannelGains == "" {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if !g.Barbarians && e.IsBarbarian() {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if !g.Internals && g.IsInternal(e) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return g.IsGain(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g GroupWithMonitors) CanSendEnnoblementNotificationTypeLoss(e Ennoblement) bool {
|
|
|
|
return g.ChannelLosses != "" && !g.IsInternal(e) && g.IsLoss(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g GroupWithMonitors) IsGain(e Ennoblement) bool {
|
|
|
|
var n bool
|
|
|
|
|
|
|
|
for _, m := range g.Monitors {
|
|
|
|
if m.TribeID == e.NewOwner.Player.Tribe.Tribe.ID {
|
|
|
|
n = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return n && !e.IsSelfConquer()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g GroupWithMonitors) IsInternal(e Ennoblement) bool {
|
|
|
|
var n, o bool
|
|
|
|
|
|
|
|
for _, m := range g.Monitors {
|
|
|
|
if m.TribeID == e.NewOwner.Player.Tribe.Tribe.ID {
|
|
|
|
n = true
|
|
|
|
}
|
|
|
|
|
|
|
|
if m.TribeID == e.Village.Player.Player.Tribe.Tribe.ID {
|
|
|
|
o = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return n && o
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g GroupWithMonitors) IsLoss(e Ennoblement) bool {
|
|
|
|
var o bool
|
|
|
|
|
|
|
|
for _, m := range g.Monitors {
|
|
|
|
if m.TribeID == e.Village.Player.Player.Tribe.Tribe.ID {
|
|
|
|
o = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return o && !e.IsSelfConquer()
|
|
|
|
}
|
|
|
|
|
2023-06-18 06:47:51 +00:00
|
|
|
type GroupWithMonitorsAndTribes struct {
|
|
|
|
Group
|
|
|
|
|
|
|
|
Monitors []MonitorWithTribe
|
|
|
|
}
|
|
|
|
|
2022-10-03 05:19:33 +00:00
|
|
|
type CreateGroupParams struct {
|
2022-10-11 05:05:35 +00:00
|
|
|
serverID string
|
|
|
|
serverKey string
|
|
|
|
versionCode string
|
|
|
|
channelGains string
|
|
|
|
channelLosses string
|
2022-10-28 11:59:20 +00:00
|
|
|
barbarians bool
|
|
|
|
internals bool
|
2023-06-30 05:09:52 +00:00
|
|
|
languageTag string
|
2022-10-03 05:19:33 +00:00
|
|
|
}
|
|
|
|
|
2022-10-28 11:59:20 +00:00
|
|
|
func NewCreateGroupParams(
|
2023-06-30 05:09:52 +00:00
|
|
|
serverID, versionCode, serverKey, languageTag, channelGains, channelLosses string,
|
2022-10-28 11:59:20 +00:00
|
|
|
barbarians, internals bool,
|
|
|
|
) (CreateGroupParams, error) {
|
2022-10-03 05:19:33 +00:00
|
|
|
if serverID == "" {
|
2023-06-27 12:00:35 +00:00
|
|
|
return CreateGroupParams{}, RequiredError{Field: "ServerID"}
|
2022-10-03 05:19:33 +00:00
|
|
|
}
|
|
|
|
|
2022-10-09 06:31:38 +00:00
|
|
|
if versionCode == "" {
|
2023-06-27 12:00:35 +00:00
|
|
|
return CreateGroupParams{}, RequiredError{Field: "VersionCode"}
|
2022-10-09 06:31:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if serverKey == "" {
|
2023-06-27 12:00:35 +00:00
|
|
|
return CreateGroupParams{}, RequiredError{Field: "ServerKey"}
|
2022-10-09 06:31:38 +00:00
|
|
|
}
|
|
|
|
|
2023-06-30 05:09:52 +00:00
|
|
|
if languageTag == "" {
|
|
|
|
return CreateGroupParams{}, RequiredError{Field: "LanguageTag"}
|
|
|
|
}
|
|
|
|
|
2022-10-09 06:31:38 +00:00
|
|
|
return CreateGroupParams{
|
2022-10-11 05:05:35 +00:00
|
|
|
serverID: serverID,
|
|
|
|
serverKey: serverKey,
|
|
|
|
versionCode: versionCode,
|
|
|
|
channelGains: channelGains,
|
|
|
|
channelLosses: channelLosses,
|
2022-10-28 11:59:20 +00:00
|
|
|
barbarians: barbarians,
|
|
|
|
internals: internals,
|
2023-06-30 05:09:52 +00:00
|
|
|
languageTag: languageTag,
|
2022-10-09 06:31:38 +00:00
|
|
|
}, nil
|
2022-10-03 05:19:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c CreateGroupParams) ServerID() string {
|
|
|
|
return c.serverID
|
|
|
|
}
|
2022-10-09 06:31:38 +00:00
|
|
|
|
|
|
|
func (c CreateGroupParams) VersionCode() string {
|
|
|
|
return c.versionCode
|
|
|
|
}
|
|
|
|
|
2023-06-30 05:09:52 +00:00
|
|
|
func (c CreateGroupParams) LanguageTag() string {
|
|
|
|
return c.languageTag
|
|
|
|
}
|
|
|
|
|
2022-10-09 06:31:38 +00:00
|
|
|
func (c CreateGroupParams) ServerKey() string {
|
|
|
|
return c.serverKey
|
|
|
|
}
|
|
|
|
|
2022-10-11 05:05:35 +00:00
|
|
|
func (c CreateGroupParams) ChannelGains() string {
|
|
|
|
return c.channelGains
|
2022-10-09 06:31:38 +00:00
|
|
|
}
|
|
|
|
|
2022-10-11 05:05:35 +00:00
|
|
|
func (c CreateGroupParams) ChannelLosses() string {
|
|
|
|
return c.channelLosses
|
2022-10-09 06:31:38 +00:00
|
|
|
}
|
2022-10-09 08:19:31 +00:00
|
|
|
|
2022-10-28 11:59:20 +00:00
|
|
|
func (c CreateGroupParams) Barbarians() bool {
|
|
|
|
return c.barbarians
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c CreateGroupParams) Internals() bool {
|
|
|
|
return c.internals
|
|
|
|
}
|
|
|
|
|
2022-10-10 05:16:40 +00:00
|
|
|
type UpdateGroupParams struct {
|
2022-10-11 05:05:35 +00:00
|
|
|
ChannelGains NullString
|
|
|
|
ChannelLosses NullString
|
2023-06-30 05:09:52 +00:00
|
|
|
LanguageTag NullString
|
2022-10-28 11:59:20 +00:00
|
|
|
Internals NullBool
|
|
|
|
Barbarians NullBool
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (u UpdateGroupParams) IsZero() bool {
|
2022-10-11 05:05:35 +00:00
|
|
|
return !u.ChannelGains.Valid &&
|
2022-10-28 11:59:20 +00:00
|
|
|
!u.ChannelLosses.Valid &&
|
|
|
|
!u.Internals.Valid &&
|
2023-06-30 05:09:52 +00:00
|
|
|
!u.Barbarians.Valid &&
|
|
|
|
!u.LanguageTag.Valid
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
2022-10-09 08:19:31 +00:00
|
|
|
type ListGroupsParams struct {
|
2022-10-31 05:52:20 +00:00
|
|
|
ServerIDs []string // DC server IDs
|
|
|
|
VersionCode NullString
|
|
|
|
ServerKeys []string
|
2022-10-29 05:24:52 +00:00
|
|
|
EnabledNotifications NullBool // check if ChannelGains != null && ChannelLosses != null
|
2022-10-31 05:52:20 +00:00
|
|
|
CreatedAtLTE time.Time
|
2022-10-09 08:19:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type GroupLimitReachedError struct {
|
|
|
|
Current int // current number of groups
|
|
|
|
Limit int // maximum number of groups
|
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
var _ TranslatableError = GroupLimitReachedError{}
|
|
|
|
|
2022-10-09 08:19:31 +00:00
|
|
|
func (e GroupLimitReachedError) Error() string {
|
|
|
|
return fmt.Sprintf("group limit has been reached (%d/%d)", e.Current, e.Limit)
|
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupLimitReachedError) Slug() string {
|
|
|
|
return "group-limit-reached"
|
2022-10-09 08:19:31 +00:00
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupLimitReachedError) Params() map[string]any {
|
|
|
|
return map[string]any{
|
|
|
|
"Current": e.Current,
|
|
|
|
"Limit": e.Limit,
|
|
|
|
}
|
2022-10-09 08:19:31 +00:00
|
|
|
}
|
2022-10-10 05:16:40 +00:00
|
|
|
|
|
|
|
type GroupNotFoundError struct {
|
|
|
|
ID string
|
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
var _ TranslatableError = GroupNotFoundError{}
|
|
|
|
|
2022-10-10 05:16:40 +00:00
|
|
|
func (e GroupNotFoundError) Error() string {
|
2023-06-18 06:47:51 +00:00
|
|
|
return fmt.Sprintf("group (id=%s) not found", e.ID)
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupNotFoundError) Slug() string {
|
|
|
|
return "group-not-found"
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupNotFoundError) Params() map[string]any {
|
|
|
|
return map[string]any{
|
|
|
|
"ID": e.ID,
|
|
|
|
}
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
2022-10-23 06:20:48 +00:00
|
|
|
|
|
|
|
type GroupDoesNotExistError struct {
|
|
|
|
ID string
|
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
var _ TranslatableError = GroupDoesNotExistError{}
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
func (e GroupDoesNotExistError) Error() string {
|
2023-06-18 06:47:51 +00:00
|
|
|
return fmt.Sprintf("group (id=%s) doesn't exist", e.ID)
|
2022-10-23 06:20:48 +00:00
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupDoesNotExistError) Slug() string {
|
|
|
|
return "group-does-not-exist"
|
2022-10-23 06:20:48 +00:00
|
|
|
}
|
|
|
|
|
2023-06-27 12:00:35 +00:00
|
|
|
func (e GroupDoesNotExistError) Params() map[string]any {
|
|
|
|
return map[string]any{
|
|
|
|
"ID": e.ID,
|
|
|
|
}
|
2022-10-23 06:20:48 +00:00
|
|
|
}
|