events
This commit is contained in:
parent
f76d92be9a
commit
af8e750cdb
4 changed files with 250 additions and 57 deletions
|
@ -50,30 +50,8 @@ func main() {
|
|||
"region": model.LinkRegion,
|
||||
"getRegion": func(id int) *model.Region { return world.Regions[id] },
|
||||
"events": model.NewEventList,
|
||||
"season": func(seconds int) string {
|
||||
r := ""
|
||||
month := seconds % 100800
|
||||
if month <= 33600 {
|
||||
r += "early "
|
||||
} else if month <= 67200 {
|
||||
r += "mid"
|
||||
} else if month <= 100800 {
|
||||
r += "late "
|
||||
}
|
||||
|
||||
season := seconds % 403200
|
||||
if season < 100800 {
|
||||
r += "spring"
|
||||
} else if season < 201600 {
|
||||
r += "summer"
|
||||
} else if season < 302400 {
|
||||
r += "autumn"
|
||||
} else if season < 403200 {
|
||||
r += "winter"
|
||||
}
|
||||
|
||||
return r
|
||||
},
|
||||
"season": model.Season,
|
||||
"time": model.Time,
|
||||
"html": func(value any) template.HTML {
|
||||
return template.HTML(fmt.Sprint(value))
|
||||
},
|
||||
|
|
|
@ -2,6 +2,7 @@ package model
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/iancoleman/strcase"
|
||||
|
@ -41,6 +42,11 @@ func (x *HistoricalEventAddHfEntityHonor) Html(c *context) string {
|
|||
func (x *HistoricalEventAddHfEntityLink) Html(c *context) string {
|
||||
h := c.hf(x.Hfid)
|
||||
e := entity(x.CivId)
|
||||
|
||||
if c.Story {
|
||||
return "the ascension of " + h + " to " + position(x.CivId, x.PositionId, x.Hfid) + " of " + e
|
||||
}
|
||||
|
||||
if x.AppointerHfid != -1 {
|
||||
e += fmt.Sprintf(", appointed by %s", c.hf(x.AppointerHfid))
|
||||
}
|
||||
|
@ -50,7 +56,7 @@ func (x *HistoricalEventAddHfEntityLink) Html(c *context) string {
|
|||
case HistoricalEventAddHfEntityLinkLink_Member:
|
||||
return h + " became a member of " + e
|
||||
case HistoricalEventAddHfEntityLinkLink_Position:
|
||||
return h + " became " + world.Entities[x.CivId].Position(x.PositionId).GenderName(world.HistoricalFigures[x.Hfid]) + " of " + e
|
||||
return h + " became " + position(x.CivId, x.PositionId, x.Hfid) + " of " + e
|
||||
case HistoricalEventAddHfEntityLinkLink_Prisoner:
|
||||
return h + " was imprisoned by " + e
|
||||
case HistoricalEventAddHfEntityLinkLink_Slave:
|
||||
|
@ -1133,7 +1139,7 @@ func (x *HistoricalEventItemStolen) Html(c *context) string {
|
|||
}
|
||||
|
||||
switch x.TheftMethod {
|
||||
case HistoricalEventItemStolenTheftMethod_Confiscated:
|
||||
case HistoricalEventItemStolenTheftMethod_Confiscated: // TODO
|
||||
case HistoricalEventItemStolenTheftMethod_Looted:
|
||||
case HistoricalEventItemStolenTheftMethod_Recovered:
|
||||
return i + " was recovered by " + c.hf(x.Histfig) + circumstance
|
||||
|
@ -1143,8 +1149,9 @@ func (x *HistoricalEventItemStolen) Html(c *context) string {
|
|||
}
|
||||
|
||||
func (x *HistoricalEventKnowledgeDiscovered) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventKnowledgeDiscovered"
|
||||
return c.hf(x.Hfid) + util.If(x.First, " was the very first to discover ", " independently discovered ") + x.Knowledge
|
||||
}
|
||||
|
||||
func (x *HistoricalEventMasterpieceArchConstructed) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventMasterpieceArchConstructed"
|
||||
}
|
||||
|
@ -1164,67 +1171,159 @@ func (x *HistoricalEventMasterpieceLost) Html(c *context) string {
|
|||
return "UNKNWON HistoricalEventMasterpieceLost"
|
||||
}
|
||||
func (x *HistoricalEventMerchant) Html(c *context) string { return "UNKNWON HistoricalEventMerchant" }
|
||||
|
||||
func (x *HistoricalEventModifiedBuilding) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventModifiedBuilding"
|
||||
return c.hf(x.ModifierHfid) + " had " + articled(x.Modification.String()) + " added " + siteStructure(x.SiteId, x.StructureId, "to")
|
||||
}
|
||||
|
||||
func (x *HistoricalEventMusicalFormCreated) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventMusicalFormCreated"
|
||||
reason := ""
|
||||
switch x.Reason {
|
||||
case HistoricalEventMusicalFormCreatedReason_GlorifyHf:
|
||||
reason = " in order to glorify " + c.hfRelated(x.ReasonId, x.HistFigureId)
|
||||
}
|
||||
circumstance := ""
|
||||
switch x.Circumstance {
|
||||
case HistoricalEventMusicalFormCreatedCircumstance_Dream:
|
||||
circumstance = " after a dream"
|
||||
case HistoricalEventMusicalFormCreatedCircumstance_DreamAboutHf:
|
||||
circumstance = " after a dreaming about " + util.If(x.ReasonId == x.CircumstanceId, c.hfShort(x.CircumstanceId), c.hfRelated(x.CircumstanceId, x.HistFigureId))
|
||||
case HistoricalEventMusicalFormCreatedCircumstance_Nightmare:
|
||||
circumstance = " after a nightmare"
|
||||
case HistoricalEventMusicalFormCreatedCircumstance_PrayToHf:
|
||||
circumstance = " after praying to " + util.If(x.ReasonId == x.CircumstanceId, c.hfShort(x.CircumstanceId), c.hfRelated(x.CircumstanceId, x.HistFigureId))
|
||||
}
|
||||
return musicalForm(x.FormId) + " was created by " + c.hf(x.HistFigureId) + site(x.SiteId, " in") + reason + circumstance
|
||||
}
|
||||
|
||||
func (x *HistoricalEventNewSiteLeader) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventNewSiteLeader"
|
||||
return entity(x.AttackerCivId) + " defeated " + siteCiv(x.SiteCivId, x.DefenderCivId) + " and placed " + c.hf(x.NewLeaderHfid) + " in charge of" + site(x.SiteId, "") +
|
||||
". The new government was called " + entity(x.NewSiteCivId)
|
||||
}
|
||||
|
||||
func (x *HistoricalEventPeaceAccepted) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventPeaceAccepted"
|
||||
return entity(x.Destination) + " accepted an offer of peace from " + entity(x.Source)
|
||||
}
|
||||
|
||||
func (x *HistoricalEventPeaceRejected) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventPeaceRejected"
|
||||
return entity(x.Destination) + " rejected an offer of peace from " + entity(x.Source)
|
||||
}
|
||||
|
||||
func (x *HistoricalEventPerformance) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventPerformance"
|
||||
r := entity(x.CivId) + " held "
|
||||
if e, ok := world.Entities[x.CivId]; ok {
|
||||
o := e.Occasion[x.OccasionId]
|
||||
s := o.Schedule[x.ScheduleId]
|
||||
r += schedule(s)
|
||||
r += " as part of " + o.Name()
|
||||
r += site(x.SiteId, " in")
|
||||
r += string(util.Json(s))
|
||||
}
|
||||
return r
|
||||
}
|
||||
func (x *HistoricalEventPlunderedSite) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventPlunderedSite"
|
||||
|
||||
func (x *HistoricalEventPlunderedSite) Html(c *context) string { // TODO no_defeat_mention, took_items, took_livestock, was_raid
|
||||
return entity(x.AttackerCivId) + " defeated " + siteCiv(x.SiteCivId, x.DefenderCivId) + " and pillaged " + site(x.SiteId, "")
|
||||
}
|
||||
|
||||
func (x *HistoricalEventPoeticFormCreated) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventPoeticFormCreated"
|
||||
circumstance := ""
|
||||
switch x.Circumstance {
|
||||
case HistoricalEventPoeticFormCreatedCircumstance_Dream:
|
||||
circumstance = " after a dream"
|
||||
case HistoricalEventPoeticFormCreatedCircumstance_Nightmare:
|
||||
circumstance = " after a nightmare"
|
||||
}
|
||||
return poeticForm(x.FormId) + " was created by " + c.hf(x.HistFigureId) + site(x.SiteId, " in") + circumstance
|
||||
}
|
||||
|
||||
func (x *HistoricalEventProcession) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventProcession"
|
||||
r := entity(x.CivId) + " held a procession in " + site(x.SiteId, "")
|
||||
if e, ok := world.Entities[x.CivId]; ok {
|
||||
o := e.Occasion[x.OccasionId]
|
||||
r += " as part of " + o.Name()
|
||||
s := o.Schedule[x.ScheduleId]
|
||||
if s.Reference != -1 {
|
||||
r += ". It started at " + structure(x.SiteId, s.Reference)
|
||||
if s.Reference2 != -1 && s.Reference2 != s.Reference {
|
||||
r += " and ended at " + structure(x.SiteId, s.Reference2)
|
||||
} else {
|
||||
r += " and returned there after following its route"
|
||||
}
|
||||
}
|
||||
if len(s.Feature) > 0 {
|
||||
r += ". The event featured " + andList(util.Map(s.Feature, feature))
|
||||
}
|
||||
r += string(util.Json(s))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func (x *HistoricalEventRazedStructure) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventRazedStructure"
|
||||
return entity(x.CivId) + " razed " + siteStructure(x.SiteId, x.StructureId, "")
|
||||
}
|
||||
func (x *HistoricalEventReclaimSite) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventReclaimSite"
|
||||
|
||||
func (x *HistoricalEventReclaimSite) Html(c *context) string { // TODO unretire
|
||||
return siteCiv(x.SiteCivId, x.CivId) + " launched an expedition to reclaim " + site(x.SiteId, "")
|
||||
}
|
||||
func (x *HistoricalEventRegionpopIncorporatedIntoEntity) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventRegionpopIncorporatedIntoEntity"
|
||||
|
||||
func (x *HistoricalEventRegionpopIncorporatedIntoEntity) Html(c *context) string { // TODO Race
|
||||
return strconv.Itoa(x.PopNumberMoved) + " of " + strconv.Itoa(x.PopRace) + " from " + region(x.PopSrid) + " joined with " + entity(x.JoinEntityId) + site(x.SiteId, " at")
|
||||
}
|
||||
|
||||
func (x *HistoricalEventRemoveHfEntityLink) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventRemoveHfEntityLink"
|
||||
hf := c.hf(x.Hfid)
|
||||
civ := entity(x.CivId)
|
||||
switch x.Link {
|
||||
case HistoricalEventRemoveHfEntityLinkLink_Member:
|
||||
return hf + " left " + civ
|
||||
case HistoricalEventRemoveHfEntityLinkLink_Position:
|
||||
return hf + " ceased to be the " + position(x.CivId, x.PositionId, x.Hfid) + " of " + civ
|
||||
case HistoricalEventRemoveHfEntityLinkLink_Prisoner:
|
||||
return hf + " escaped from the prisons of " + civ
|
||||
case HistoricalEventRemoveHfEntityLinkLink_Slave:
|
||||
return hf + " escaped from the slavery of " + civ
|
||||
}
|
||||
return hf + " left " + civ
|
||||
}
|
||||
func (x *HistoricalEventRemoveHfHfLink) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventRemoveHfHfLink"
|
||||
|
||||
func (x *HistoricalEventRemoveHfHfLink) Html(c *context) string { // divorced
|
||||
return c.hf(x.Hfid) + " and " + c.hfRelated(x.HfidTarget, x.Hfid) + " broke up"
|
||||
}
|
||||
|
||||
func (x *HistoricalEventRemoveHfSiteLink) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventRemoveHfSiteLink"
|
||||
switch x.LinkType {
|
||||
case HistoricalEventRemoveHfSiteLinkLinkType_HomeSiteAbstractBuilding:
|
||||
return c.hf(x.Histfig) + " moved out " + siteStructure(x.SiteId, x.Structure, "of")
|
||||
case HistoricalEventRemoveHfSiteLinkLinkType_Occupation:
|
||||
return c.hf(x.Histfig) + " stopped working " + siteStructure(x.SiteId, x.Structure, "at")
|
||||
case HistoricalEventRemoveHfSiteLinkLinkType_SeatOfPower:
|
||||
return c.hf(x.Histfig) + " stopped ruling " + siteStructure(x.SiteId, x.Structure, "from")
|
||||
}
|
||||
return c.hf(x.Histfig) + " stopped working " + siteStructure(x.SiteId, x.Structure, "at")
|
||||
}
|
||||
|
||||
func (x *HistoricalEventReplacedStructure) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventReplacedStructure"
|
||||
return siteCiv(x.SiteCivId, x.CivId) + " replaced " + siteStructure(x.SiteId, x.OldAbId, "") + " with " + structure(x.SiteId, x.NewAbId)
|
||||
}
|
||||
func (x *HistoricalEventSiteDied) Html(c *context) string { return "UNKNWON HistoricalEventSiteDied" }
|
||||
|
||||
func (x *HistoricalEventSiteDied) Html(c *context) string { return "UNKNWON HistoricalEventSiteDied" } // TODO
|
||||
|
||||
func (x *HistoricalEventSiteDispute) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventSiteDispute"
|
||||
return entity(x.EntityId1) + " of " + site(x.SiteId1, "") + " and " + entity(x.EntityId2) + " of " + site(x.SiteId2, "") + " became embroiled in a dispute over " + x.Dispute.String()
|
||||
}
|
||||
func (x *HistoricalEventSiteRetired) Html(c *context) string {
|
||||
|
||||
func (x *HistoricalEventSiteRetired) Html(c *context) string { // TODO
|
||||
return "UNKNWON HistoricalEventSiteRetired"
|
||||
}
|
||||
func (x *HistoricalEventSiteSurrendered) Html(c *context) string {
|
||||
func (x *HistoricalEventSiteSurrendered) Html(c *context) string { // TODO
|
||||
return "UNKNWON HistoricalEventSiteSurrendered"
|
||||
}
|
||||
|
||||
func (x *HistoricalEventSiteTakenOver) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventSiteTakenOver"
|
||||
return entity(x.AttackerCivId) + " defeated " + siteCiv(x.SiteCivId, x.DefenderCivId) + " and took over " + site(x.SiteId, "") + ". The new government was called " + entity(x.NewSiteCivId)
|
||||
}
|
||||
|
||||
func (x *HistoricalEventSiteTributeForced) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventSiteTributeForced"
|
||||
}
|
||||
|
@ -1240,9 +1339,38 @@ func (x *HistoricalEventSquadVsSquad) Html(c *context) string {
|
|||
func (x *HistoricalEventTacticalSituation) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventTacticalSituation"
|
||||
}
|
||||
func (x *HistoricalEventTrade) Html(c *context) string { return "UNKNWON HistoricalEventTrade" }
|
||||
|
||||
func (x *HistoricalEventTrade) Html(c *context) string {
|
||||
outcome := ""
|
||||
switch d := x.AccountShift; {
|
||||
case d > 1000:
|
||||
outcome = " did well"
|
||||
case d < -1000:
|
||||
outcome = " did poorly"
|
||||
default:
|
||||
outcome = " broke even"
|
||||
}
|
||||
return c.hf(x.TraderHfid) + util.If(x.TraderEntityId != -1, " of "+entity(x.TraderEntityId), "") + outcome + " trading" + site(x.SourceSiteId, " from") + site(x.DestSiteId, " to")
|
||||
}
|
||||
|
||||
func (x *HistoricalEventWrittenContentComposed) Html(c *context) string {
|
||||
return "UNKNWON HistoricalEventWrittenContentComposed"
|
||||
reason := ""
|
||||
switch x.Reason {
|
||||
case HistoricalEventWrittenContentComposedReason_GlorifyHf:
|
||||
reason = " in order to glorify " + c.hfRelated(x.ReasonId, x.HistFigureId)
|
||||
}
|
||||
circumstance := ""
|
||||
switch x.Circumstance {
|
||||
case HistoricalEventWrittenContentComposedCircumstance_Dream:
|
||||
circumstance = " after a dream"
|
||||
case HistoricalEventWrittenContentComposedCircumstance_DreamAboutHf:
|
||||
circumstance = " after a dreaming about " + util.If(x.ReasonId == x.CircumstanceId, c.hfShort(x.CircumstanceId), c.hfRelated(x.CircumstanceId, x.HistFigureId))
|
||||
case HistoricalEventWrittenContentComposedCircumstance_Nightmare:
|
||||
circumstance = " after a nightmare"
|
||||
case HistoricalEventWrittenContentComposedCircumstance_PrayToHf:
|
||||
circumstance = " after praying to " + util.If(x.ReasonId == x.CircumstanceId, c.hfShort(x.CircumstanceId), c.hfRelated(x.CircumstanceId, x.HistFigureId))
|
||||
}
|
||||
return writtenContent(x.WcId) + " was authored by " + c.hf(x.HistFigureId) + location(x.SiteId, " in", x.SubregionId, " in") + reason + circumstance
|
||||
}
|
||||
|
||||
func (x *HistoricalEventAgreementConcluded) Html(c *context) string {
|
||||
|
|
|
@ -56,6 +56,10 @@ func (hf *HistoricalFigure) FirstName() string {
|
|||
return strings.Split(hf.Name_, " ")[0]
|
||||
}
|
||||
|
||||
func (w *WrittenContent) Name() string {
|
||||
return w.Title
|
||||
}
|
||||
|
||||
type HistoricalEventDetails interface {
|
||||
RelatedToEntity(int) bool
|
||||
RelatedToHf(int) bool
|
||||
|
@ -112,7 +116,8 @@ func NewEventList(obj any) *EventList {
|
|||
}
|
||||
|
||||
type context struct {
|
||||
HfId int
|
||||
HfId int
|
||||
Story bool
|
||||
}
|
||||
|
||||
func (c *context) hf(id int) string {
|
||||
|
@ -241,6 +246,15 @@ func hfRelated(id, to int) string {
|
|||
return "UNKNOWN HISTORICAL FIGURE"
|
||||
}
|
||||
|
||||
func hfLink(id, to int) string {
|
||||
if x, ok := world.HistoricalFigures[id]; ok {
|
||||
if y, ok := util.Find(x.HfLink, func(l *HfLink) bool { return l.Hfid == to }); ok {
|
||||
return y.LinkType.String()
|
||||
}
|
||||
}
|
||||
return "UNKNOWN LINK"
|
||||
}
|
||||
|
||||
func pronoun(id int) string {
|
||||
if x, ok := world.HistoricalFigures[id]; ok {
|
||||
return x.Pronoun()
|
||||
|
@ -339,7 +353,9 @@ func feature(x *Feature) string {
|
|||
return "a recital of " + poeticForm(x.Reference)
|
||||
case FeatureType_Storytelling:
|
||||
if x.Reference != -1 {
|
||||
return "a telling of the story of " + hf(x.Reference)
|
||||
if e, ok := world.HistoricalEvents[x.Reference]; ok {
|
||||
return "a telling of the story of " + e.Details.Html(&context{Story: true}) + " in " + Time(e.Year, e.Seconds72)
|
||||
}
|
||||
}
|
||||
return "a story recital"
|
||||
default:
|
||||
|
@ -347,6 +363,68 @@ func feature(x *Feature) string {
|
|||
}
|
||||
}
|
||||
|
||||
func schedule(x *Schedule) string {
|
||||
switch x.Type {
|
||||
case ScheduleType_DancePerformance:
|
||||
return "a perfomance of " + danceForm(x.Reference)
|
||||
case ScheduleType_MusicalPerformance:
|
||||
return "a perfomance of " + musicalForm(x.Reference)
|
||||
case ScheduleType_PoetryRecital:
|
||||
return "a recital of " + poeticForm(x.Reference)
|
||||
case ScheduleType_Storytelling:
|
||||
if x.Reference != -1 {
|
||||
if e, ok := world.HistoricalEvents[x.Reference]; ok {
|
||||
return "the story of " + e.Details.Html(&context{Story: true}) + " in " + Time(e.Year, e.Seconds72)
|
||||
}
|
||||
}
|
||||
return "a story recital"
|
||||
default:
|
||||
return strcase.ToDelimited(x.Type.String(), ' ')
|
||||
}
|
||||
}
|
||||
|
||||
func ShortTime(year, seconds int) string {
|
||||
if year == -1 {
|
||||
return "a time before time"
|
||||
}
|
||||
return fmt.Sprintf("%d", year)
|
||||
}
|
||||
|
||||
func Time(year, seconds int) string {
|
||||
if year == -1 {
|
||||
return "a time before time"
|
||||
}
|
||||
if seconds == -1 {
|
||||
return fmt.Sprintf("%d", year)
|
||||
}
|
||||
return fmt.Sprintf("%s of %d", Season(seconds), year)
|
||||
}
|
||||
|
||||
func Season(seconds int) string {
|
||||
r := ""
|
||||
month := seconds % 100800
|
||||
if month <= 33600 {
|
||||
r += "early "
|
||||
} else if month <= 67200 {
|
||||
r += "mid"
|
||||
} else if month <= 100800 {
|
||||
r += "late "
|
||||
}
|
||||
|
||||
season := seconds % 403200
|
||||
if season < 100800 {
|
||||
r += "spring"
|
||||
} else if season < 201600 {
|
||||
r += "summer"
|
||||
} else if season < 302400 {
|
||||
r += "autumn"
|
||||
} else if season < 403200 {
|
||||
r += "winter"
|
||||
}
|
||||
|
||||
return r
|
||||
}
|
||||
|
||||
func danceForm(id int) string {
|
||||
if x, ok := world.DanceForms[id]; ok {
|
||||
return fmt.Sprintf(`<a class="artform" href="/danceForm/%d">%s</a>`, id, util.Title(x.Name()))
|
||||
|
@ -375,6 +453,13 @@ func worldConstruction(id int) string {
|
|||
return "UNKNOWN WORLD CONSTRUCTION"
|
||||
}
|
||||
|
||||
func writtenContent(id int) string {
|
||||
if x, ok := world.WrittenContents[id]; ok {
|
||||
return fmt.Sprintf(`<a class="artform" href="/writtenContent/%d">%s</a>`, id, util.Title(x.Name()))
|
||||
}
|
||||
return "UNKNOWN WORLD CONSTRUCTION"
|
||||
}
|
||||
|
||||
var LinkHf = func(id int) template.HTML { return template.HTML(hf(id)) }
|
||||
var LinkEntity = func(id int) template.HTML { return template.HTML(entity(id)) }
|
||||
var LinkSite = func(id int) template.HTML { return template.HTML(site(id, "")) }
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
"Site": "SiteId"
|
||||
},
|
||||
"HistoricalEventHfDied": {
|
||||
"ShooterArtifactId": "FeatureLayerId"
|
||||
"ItemSubtype": "Cause",
|
||||
"Mat": "Cause",
|
||||
"ShooterMat": "Cause"
|
||||
},
|
||||
"HistoricalEventPeaceAccepted": {
|
||||
"Site": "SiteId"
|
||||
|
|
Loading…
Reference in a new issue