Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ add FilterDuration and replace FilterTime in InitPostEvent… #544

Merged
merged 5 commits into from
Jul 1, 2024

Conversation

iChemy
Copy link
Contributor

@iChemy iChemy commented Jun 18, 2024

@iChemy
Copy link
Contributor Author

iChemy commented Jun 18, 2024

ある期間中(例: 今日中)にイベントが開催される瞬間があるかどうかをフィルターするために
func FilterDuration(min, max time.Time) Expr
を定義しこれを traQ にメッセージをポストする部分に適応させた.

utils パッケージ内で func addOr(lhs, rhs Expr) Exprというローカル関数を定義し func FilterDuration(min, max time.Time) Expr 内で用いている

traQに送信されるメッセージに時刻だけでなく日付の情報もわかるようにした(例)

## 06/20(Thu) の進捗部屋
本日は予約を取っていないようです。
## 06/20(Thu) 開催予定のイベント
本日開催されるイベントは、
- [イベント1](origin/events/61f5219b-ffb7-4546-9b6d-7ac1a9367c19) 06/19:13:00 ~ 06/23:13:00 @Discord 
- [イベント2](origin/events/72173508-348d-4021-8d0e-557912a09728) 06/20:12:00 ~ 06/20:18:00 @Discord

@iChemy iChemy requested review from Nzt3-gh and ras0q June 18, 2024 04:46
Copy link
Member

@ras0q ras0q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます!
幾つか書きました

// 期間より前に始まり期間より後に終わる
// time_start < min AND time_end >= max
//
// min < max であるべき
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは直接コードで!min.IsZero() && !max.IsZero()であることを確認した上で時系列を判定するとよさそうです

// time_start < min AND time_end >= max
//
// min < max であるべき
func FilterDuration(min, max time.Time) Expr {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

最近minとmaxがbuiltinの関数名に追加されたので他の名前にしておくと余計な誤解を招かなくてよいです(動きはするんですが)

since, untilなど

Rhs: endAfterMax,
}

return addOr(addOr(startIn, endIn), throughout)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

addOr使わずに直接書いた方が見やすそう(この関数内のAndはそうしてるし)

utils/cron.go Outdated
Comment on lines 165 to 166
eventMessage += fmt.Sprintf("- [%s](%s/events/%s) %s ~ %s @%s %s\n", event.Name, origin, event.ID,
event.TimeStart.In(tz.JST).Format("15:04"), event.TimeEnd.In(tz.JST).Format("15:04"),
eventMessage += fmt.Sprintf("- [%s](%s/events/%s) %s:%s ~ %s:%s @%s %s\n", event.Name, origin, event.ID,
event.TimeStart.In(tz.JST).Format("01/02"), event.TimeStart.In(tz.JST).Format("15:04"), event.TimeEnd.In(tz.JST).Format("01/02"), event.TimeEnd.In(tz.JST).Format("15:04"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Format("01/02:15:04")でよさそう
あと日付と時間の区切りに:を見るのはあまり見ないので空白区切りがいいと思います

Comment on lines 114 to 121
// 期間中に始まる
// time_start >= min AND time_start < max
//
// 期間中に終わる
// time_end >= min AND time_end < max
//
// 期間より前に始まり期間より後に終わる
// time_start < min AND time_end >= max
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これをORで繋ぐことを明記すると良いと思います

Suggested change
// 期間中に始まる
// time_start >= min AND time_start < max
//
// 期間中に終わる
// time_end >= min AND time_end < max
//
// 期間より前に始まり期間より後に終わる
// time_start < min AND time_end >= max
// 以下のいずれかを満たす
// - 期間中に始まる (time_start >= min AND time_start < max)
// - 期間中に終わる (time_end >= min AND time_end < max)
// - 期間より前に始まり期間より後に終わる (time_start < min AND time_end >= max)

@iChemy
Copy link
Contributor Author

iChemy commented Jun 20, 2024

修正してみました 🙇
お時間ある際に確認お願いします

Copy link
Member

@ras0q ras0q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューしました!
今回のレビューはFilterDurationに関するものだけなのでまあ1コミットでもいいんですが、Refactoring codeみたいなコミットを打つと1コミットの粒度が大きくなってしまうので、1コミットでは最小単位の変更を記録してコミットを分割してくれると助かります!

@@ -93,3 +93,78 @@ func AddAnd(lhs, rhs Expr) Expr {
Rhs: rhs,
}
}

// 以下のいずれかを満たす
// * 期間中に始まる (time_start >= min AND time_start < max)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここら辺のコメントもsince,untilにしてほしいです

// * 期間中に終わる (time_end >= min AND time_end < max)
// * 期間より前に始まり期間より後に終わる (time_start < min AND time_end >= max)
//
// since < until でない場合 nil を返す
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nilを返すより返り値にエラーを追加してエラーを返すのが良さそう

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

InitPostEventToTraQ 内における filter.FilterDuration のエラーハンドリングですがどうするのが適切でしょうか?
同関数内の repo.GetAllRoomsrepo.GetAllEvents はエラー値は利用されてないのですが filter.FilterDuration も同様にエラー値は無視するという形が良いかと思っています.

こんな感じ

expr, _ := filter.FilterDuration(now, tomorrow)
events, _ := repo.GetAllEvents(expr)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cron jobを作ってるからerrorが返せないのか

		err := RequestWebhook(message, secret, channelID, webhookID, 1)
		if err != nil {
			fmt.Println(err)
		}

の部分みたいにprintしておくだけでもやっておくと良いと思います

}
}

startAfterMin := &CmpExpr{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここもstartAfterSinceとかにしたいが流石に文法に違和感があるのであまりいい名前が思いつかない
変に変数名付けずにstartInの中に直接入れてもそこまで分かりにくくはならないとも思ったり

@iChemy
Copy link
Contributor Author

iChemy commented Jun 23, 2024

新しく

	if !since.IsZero() && !until.IsZero() {
		if since.After(until) {
			return nil, errors.New("invalid time range")
		}
	}

を返すようにしました

書いてて思ったんですが
IsZero()の条件のところいらない
かなと思ったのですがどう思いますか?

こんな感じ

		if since.After(until) {
			return nil, errors.New("invalid time range")
		}

(ただsinceuntil の前後関係を確認するだけの方がこの関数に想定される挙動な気がしています)

Comment on lines 139 to 154
startBeforeMin := &CmpExpr{
Attr: AttrTimeStart,
Relation: Less,
Value: since,
}
endAfterMax := &CmpExpr{
Attr: AttrTimeEnd,
Relation: GreterEq,
Value: until,
}
// 期間より前に始まり期間より後に終わる
throughout := &LogicOpExpr{
LogicOp: And,
Lhs: startBeforeMin,
Rhs: endAfterMax,
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここも上と同様throughoutの中に直接書いちゃって良さそうです

@ras0q
Copy link
Member

ras0q commented Jun 23, 2024

元のFilterTimeの実装を見るとIsZeroのときは時刻を指定しないということを意味してるようですね(knoQでは)
そうなるとそこのIsZeroはいらないんですが、別で

  • since,untilがどっちも指定されている(!IsZero())ときは今の3つの条件
  • sinceのみが指定されているときはsince<=終了時刻
  • untilのみが指定されているときは開始時刻<=until
  • どちらも指定されていない時はnil(条件なし)

を返す必要がありそうです

IsZero()の条件のところいらない
かなと思ったのですがどう思いますか?

@iChemy
Copy link
Contributor Author

iChemy commented Jun 24, 2024

お願いします 🙇

return nil, errors.New("invalid time range")
}
if since.IsZero() && until.IsZero() {
return nil, nil
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここはエラーを返したい

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

嘘です
エラーはnilでいいけどExprはnilではなくて空の&CmpExpr{}を返すのがよさそう

Copy link
Member

@ras0q ras0q left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1件レビューしましたがそれ治したらマージしてOKです:thumbsup:

@iChemy iChemy merged commit a9a665d into main Jul 1, 2024
2 checks passed
@iChemy iChemy deleted the fix/issue541 branch July 1, 2024 11:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants