package guild import ( "context" "errors" "time" "gorm.io/gorm" "bindbox-game/internal/repository/mysql/model" ) func (s *service) JoinGuild(ctx context.Context, guildID int64, in JoinGuildInput) error { g, err := s.readDB.Guild.WithContext(ctx).Where(s.readDB.Guild.ID.Eq(guildID)).First() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } lastExit, err := s.readDB.GuildMembers.WithContext(ctx). Where(s.readDB.GuildMembers.UserID.Eq(in.UserID)). Where(s.readDB.GuildMembers.Status.Eq(2)). Order(s.readDB.GuildMembers.ID.Desc()). Limit(1).Find() if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } if len(lastExit) > 0 { exitAt := lastExit[0].StartTime if time.Since(exitAt) < 24*time.Hour { return errors.New("recently left a guild, join limited within 24h") } } exists, err := s.readDB.GuildMembers.WithContext(ctx). Where(s.readDB.GuildMembers.GuildID.Eq(guildID)). Where(s.readDB.GuildMembers.UserID.Eq(in.UserID)). Where(s.readDB.GuildMembers.Status.Eq(1)).Count() if err != nil { return err } if exists > 0 { return errors.New("already a member") } joinStatus := int32(2) var startTime time.Time if g != nil && g.JoinMode == 1 { joinStatus = 0 startTime = time.Time{} } else { startTime = time.Now() } m := &model.GuildMembers{ GuildID: guildID, UserID: in.UserID, Role: "member", StartTime: startTime, Status: 1, JoinStatus: joinStatus, } return s.writeDB.GuildMembers.WithContext(ctx).Create(m) }