package main import ( "errors" "log" "regexp" "strconv" "time" ) type ChatWarsMessage struct { UserID64 int64 `json:"user_id"` SenderUserID64 int64 `json:"sender_user_id"` Date int32 `json:"date"` ID64 int64 `json:"id"` ChatID64 int64 `json:"chat_id"` Text string `json:"text"` } type MessageParsingRule struct { ID int32 Priority int32 Description string Rule string MsgTypeID int32 re *regexp.Regexp } const ( objTypeUser = 1 objTypeGuild = 2 objTypeMessage = 3 objTypeWar = 4 objTypeWarReport = 5 objTypeJob = 6 objSubTypeMessageUnknown = 301 objSubTypeMessageWar = 302 objSubTypeMessageMiniWar = 303 objSubTypeMessageGuildWar = 304 objSubTypeMessageReport = 305 objSubTypeMessageGReport = 306 objSubTypeMessageQuest = 307 objSubTypeMessageFight = 308 objSubTypeMessageHero = 309 objSubTypeMessageMe = 310 objSubTypeMessageInventory = 311 objSubTypeMessagePillageInc = 312 objSubTypeMessageTributeInc = 313 objSubTypeMessagePillageAck = 314 objSubTypeMessageTributeAck = 315 objSubTypeMessageAuctionAnnounce = 316 objSubTypeMessageTime = 317 objSubTypeJobPillage = 601 objSubTypeJobTribute = 602 objSubTypeJobStatus = 603 objSubTypeJobWithdrawal = 604 objSubTypeJobGStock = 605 MQGetMsgWorkers = 3 SQLCWMsgWorkers = 6 SQLIdentifyMsgWorkers = 6 SQLJobWorkers = 3 ) var ( chatWarsMonth = map[string]int{ "Wintar": 1, "Hornung": 2, "Lenzin": 3, "Ōstar": 4, "Winni": 5, "Brāh": 6, "Hewi": 7, "Aran": 8, "Witu": 9, "Wīndume": 10, "Herbist": 11, "Hailag": 12} chatWarsDaysSpecial = map[int]map[int]int{ 2: {1060: 29}, 4: {1060: 29}} chatWarsDays = map[int]int{ 1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31} ) func fromChatWarsDate(d string) (t time.Time, err error) { r := regexp.MustCompile(`(?P[0-9]{2}) (?P(Wintar|Hornung|Lenzin|Ōstar|Winni|Brāh|Hewi|Aran|Witu|Wīndume|Herbist|Hailag)) (?P[0-9]{4})( (?P[0-9]{2}):(?P[0-9]{2})){0,1}`) if r.FindStringSubmatch(d) != nil { log.Printf("fromChatWarsDate : Day : %s\n", r.ReplaceAllString(d, "${Day}")) day, _ := strconv.Atoi(r.ReplaceAllString(d, "${Day}")) log.Printf("fromChatWarsDate : Month : %s\n", r.ReplaceAllString(d, "${Month}")) log.Printf("fromChatWarsDate : Year : %s\n", r.ReplaceAllString(d, "${Year}")) year, _ := strconv.Atoi(r.ReplaceAllString(d, "${Year}")) log.Printf("fromChatWarsDate : Hour : %s\n", r.ReplaceAllString(d, "${Hour}")) hour, _ := strconv.Atoi(r.ReplaceAllString(d, "${Hour}")) log.Printf("fromChatWarsDate : Minute : %s\n", r.ReplaceAllString(d, "${Minute}")) minute, _ := strconv.Atoi(r.ReplaceAllString(d, "${Minute}")) days := int(0) for i := 1059; i < year; i++ { days = days + 365 } for i := 1; i < chatWarsMonth[r.ReplaceAllString(d, "${Month}")]; i++ { if _, special := chatWarsDaysSpecial[year][i]; special { days = days + chatWarsDaysSpecial[year][i] } else { days = days + chatWarsDays[i] } } for i := 1; i < day; i++ { days++ } t, _ := time.Parse(time.RFC3339, "2017-10-01T00:00:00+00:00") t = t.AddDate(0, 0, (days / 3)) t = t.Add(time.Hour * time.Duration(days%3) * 8) t = t.Add(time.Minute * time.Duration(hour) * 20) t = t.Add(time.Second * time.Duration(minute) * 20) return t, nil } else { return time.Now(), errors.New("Wrong format") } } func toChatWarsDate(t time.Time) (s string, err error) { return "test", nil }