This commit is contained in:
2026-03-26 12:28:21 +07:00
parent 3b93fd0ec2
commit a7a9715faf
15 changed files with 176 additions and 136 deletions
+2 -2
View File
@@ -23,6 +23,6 @@ func (s *Server) Ping(_ context.Context, _ *proto.PingReq) (*proto.PingRsp, erro
return &proto.PingRsp{}, nil
}
func (s *Server) GetDays(ctx context.Context, req *proto.GetDaysReq) (*proto.GetDaysRsp, error) {
return s.services.GetDays(ctx, req)
func (s *Server) GetSchedule(ctx context.Context, req *proto.GetScheduleReq) (*proto.GetScheduleRsp, error) {
return s.services.GetSchedule(ctx, req)
}
+5
View File
@@ -2,6 +2,11 @@ package models
import "time"
type Schedule struct {
UpdateTime string `json:"update_time"`
Days []*Day `json:"days"`
}
// День с событиями
type Day struct {
Date time.Time `json:"date"`
+19 -11
View File
@@ -45,24 +45,29 @@ func (p *ScheduleParser) Run(ctx context.Context) {
defer ticker.Stop()
sheetURL := "https://docs.google.com/spreadsheets/d/1v57bCAG764j1ULXDMb3amNFMzkkLmObKWsl5oE0Xq00/edit?gid=57461713#gid=57461713"
p.parseAndSaveSchedule(ctx, sheetURL)
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
days, err := p.parseSchedule(ctx, sheetURL)
if err != nil {
log.Printf("Error parse schedule: %s\n", sheetURL)
break
}
if err := p.scheduleStorage.SaveSchedule(days); err != nil {
log.Printf("Error save err: %s schedule: %s\n", err, sheetURL)
}
p.parseAndSaveSchedule(ctx, sheetURL)
}
}
}
func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) ([]*models.Day, error) {
func (p *ScheduleParser) parseAndSaveSchedule(ctx context.Context, sheetURL string) {
schedule, err := p.parseSchedule(ctx, sheetURL)
if err != nil {
log.Printf("Error parse schedule: %s\n", sheetURL)
return
}
if err := p.scheduleStorage.SaveSchedule(schedule); err != nil {
log.Printf("Error save err: %s schedule: %s\n", err, sheetURL)
}
}
func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) (*models.Schedule, error) {
var performances []performance
if err := p.dataParser.Parse(ctx, sheetURL, &performances); err != nil {
return nil, err
@@ -70,7 +75,7 @@ func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) ([]
return p.mapSchedule(performances), nil
}
func (p *ScheduleParser) mapSchedule(performances []performance) []*models.Day {
func (p *ScheduleParser) mapSchedule(performances []performance) *models.Schedule {
days := []*models.Day{}
currentDay := &models.Day{}
for i, performance := range performances {
@@ -101,7 +106,10 @@ func (p *ScheduleParser) mapSchedule(performances []performance) []*models.Day {
)
}
days = append(days, currentDay)
return days
return &models.Schedule{
UpdateTime: time.Now().String(),
Days: days,
}
}
func (p *ScheduleParser) mapDate(date string) (time.Time, error) {
+24 -11
View File
@@ -6,6 +6,7 @@ import (
"log"
"os"
"pinned_message/internal/models"
"strings"
"time"
)
@@ -21,36 +22,48 @@ func NewScheduleStorage(
}
}
func (s *ScheduleStorage) SaveSchedule(days []*models.Day) error {
data, err := json.Marshal(days)
func (s *ScheduleStorage) SaveSchedule(schedule *models.Schedule) error {
data, err := json.Marshal(schedule)
if err != nil {
return err
}
if err := os.WriteFile(s.filepath, data, 0644); err != nil {
return err
}
log.Printf("save story to: %s", s.filepath)
log.Printf("save schedule to: %s", s.filepath)
return nil
}
func (s *ScheduleStorage) GetSchedule() ([]*models.Day, error) {
func (s *ScheduleStorage) GetSchedule() (*models.Schedule, error) {
data, err := os.ReadFile(s.filepath)
if err != nil {
return nil, fmt.Errorf("story file %s not found", s.filepath)
return nil, fmt.Errorf("schedule file %s not found", s.filepath)
}
log.Printf("load story from: %s", s.filepath)
days := []*models.Day{}
if err := json.Unmarshal(data, &days); err != nil {
log.Printf("load schedule from: %s", s.filepath)
schedule := &models.Schedule{}
if err := json.Unmarshal(data, &schedule); err != nil {
return nil, err
}
filterDays := make([]*models.Day, 0, len(days))
for _, day := range days {
filterDays := make([]*models.Day, 0, len(schedule.Days))
for _, day := range schedule.Days {
if isBeforeToday(day.Date) {
continue
}
for i := range day.Performances {
filterNumbers := make([]*models.Number, 0, len(day.Performances[i].Numbers))
for _, number := range day.Performances[i].Numbers {
name := strings.TrimSpace(number.Name)
if name == "" || name == "-" {
continue
}
filterNumbers = append(filterNumbers, number)
}
day.Performances[i].Numbers = filterNumbers
}
filterDays = append(filterDays, day)
}
return filterDays, nil
schedule.Days = filterDays
return schedule, nil
}
func isBeforeToday(targetDate time.Time) bool {
+6 -4
View File
@@ -21,15 +21,17 @@ func NewServices(
}
}
func (s *Services) GetDays(context.Context, *proto.GetDaysReq) (*proto.GetDaysRsp, error) {
days, err := s.scheduleStorage.GetSchedule()
func (s *Services) GetSchedule(context.Context, *proto.GetScheduleReq) (*proto.GetScheduleRsp, error) {
schedule, err := s.scheduleStorage.GetSchedule()
if err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
res := &proto.GetDaysRsp{}
for _, day := range days {
res := &proto.GetScheduleRsp{
UpdateTime: schedule.UpdateTime,
}
for _, day := range schedule.Days {
resPerformances := make([]*proto.Performance, 0, len(day.Performances))
for _, performance := range day.Performances {
resNumbers := make([]*proto.Number, 0, len(performance.Numbers))