-
Notifications
You must be signed in to change notification settings - Fork 0
/
MisskeyBirthViewer.is
288 lines (249 loc) · 10.7 KB
/
MisskeyBirthViewer.is
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/// @ 0.16.0
### {
name: "直近の誕生日を持つフォローユーザー一覧を取得するプラグイン"
version: "0.2.0"
author: "はとぽぷ(@[email protected])"
description: "このプラグインは、フォローしているユーザーの中で、誕生日が近い人々を見つけ出し、一覧表示します。特別な日を忘れずに、友達や知り合いに温かいメッセージを送れるようにしましょう。"
permissions: ["read:following"]
config: {
dateInputIsEnabled: {
type: "boolean",
label: "日数の手動入力",
description: "毎回、誕生日を取得する日数を手動で入力するかどうかを設定します。"
default: true
}
dateLimit: {
type: "number",
label: "取得日数",
description: "取得する日数を入力してください。リクエストは1日単位で行われ、各日についてフォローユーザーの誕生日情報を取得します。サーバーに過度な負荷をかけないよう、適切な数値を設定してください。最大値: 365"
default: 7
}
processTimeCoef : {
type: "number",
label: "総処理時間見積係数",
description: "各リクエストの間隔として設定される時間の合計に対して、実際の処理時間の見積もりを行うための係数です。デフォルト値1.3"
default: 1.3
}
birthdayHeaderText: {
type: "string",
label: "誕生日ヘッダーテキスト",
description: "誕生日一覧ダイアログのヘッダーに表示するテキスト。"
default: ":happy_birth_day__i:"
}
birthdaySuffixText: {
type: "string",
label: "お祝いテキスト",
description: "本日誕生日のユーザーに表示するお祝いテキスト。"
default: ":omedetou:"
}
birthdayIsVisible: {
type: "boolean",
label: "誕生日表示",
description: "ダイアログに各ユーザーの誕生日を表示するかどうかを設定します。"
default: true
}
inactiveDaysLimit: {
type: "number",
label: "Inactive日数",
description: "最終更新日からの経過日数がこの値を超えたユーザーをInactiveユーザーとして判定します。"
default: 30
}
excludeInactiveUsers: {
type: "boolean",
label: "Inactiveユーザーを除外",
description: "最終更新日から指定された日数を超えて更新がないInactiveユーザーをリストから除外します。",
default: false
}
excludeMuteUsers: {
type: "boolean",
label: "ミュート中のユーザーを除外",
description: "ミュートしているユーザーをリストから除外します。",
default: false
}
}
}
// APIでフォローを取得する関数
@getFollowing(user_id, birth_date, limit) {
let resultList = []
let payload = {
userId: user_id
birthday: birth_date
limit: limit
}
let result = Mk:api(`users/following` payload)
each (let res result){
resultList.push(res)
}
resultList
}
// Inactiveユーザーを判定する関数
@isUserInactive(updatedAt) {
var currentTime = Date:now()
var updatedAtTime = Date:parse(updatedAt)
var differenceInDays = (currentTime - updatedAtTime) / (1000 * 3600 * 24)
// 設定からInactive日数の上限を取得
var inactiveDaysLimit = Plugin:config.inactiveDaysLimit
// 最終更新日からの経過日数が設定値以上ならtrueを返す
return differenceInDays > inactiveDaysLimit
}
// ユーザーと誕生日の一覧を取得する関数
@getUserBirthList(resultList, birthdayFlag) {
let birthList = []
each (let result resultList) {
let id = result.followee.id
let name = result.followee.name
var username = result.followee.username
var userHost = result.followee.host
var birthday = result.followee.birthday
let updatedAt = result.followee.updatedAt
let isBlocking = result.followee.isBlocking
let isBlocked = result.followee.isBlocked
let isMuted = result.followee.isMuted
// 設定に基づいてユーザーを除外
if (Plugin:config.excludeInactiveUsers && isUserInactive(updatedAt)) {
continue // 次のループへスキップ
}
if (Plugin:config.excludeMuteUsers && isMuted) {
continue
}
// リモートユーザー対応
if (userHost == null) {
username = `@{result.followee.username}`
} else {
username = `@{result.followee.username}@{userHost}`
}
let resultTextList = []
// 誕生日を表示するかの設定
if (Plugin:config.birthdayIsVisible) {
resultTextList.push(`{birthday}`)
}
// ユーザー名を表示するかの設定
resultTextList.push(`{username} {name}さん`)
// Inactiveユーザーの場合の最終更新日追加表示
if (isUserInactive(updatedAt)) {
// Inactiveユーザーの場合の処理をここに書く
var formattedDate = updatedAt.split('T')[0]
resultTextList.push(`<small><small>(Inactive: 最終更新日: {formattedDate})</small></small>`)
}
// 本日誕生日のユーザーの末尾お祝いテキストを表示するかの設定
if (birthdayFlag) {
resultTextList.push(`{Plugin:config.birthdaySuffixText}`)
}
let resultText = resultTextList.join(" ")
birthList.push(resultText)
}
return birthList
}
@addDays(date, daysToAdd) {
var newDay = date.day + daysToAdd
var newMonth = date.month
var newYear = date.year
// 月ごとの日数を定義
var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
// 閏年の判定
if (newYear % 4 == 0 && (newYear % 100 != 0 || newYear % 400 == 0)) {
daysInMonth[1] = 29
}
// 日付の加算と月の繰り上げ
var count = 0
loop {
if (newDay <= daysInMonth[newMonth - 1]) break
newDay = newDay - daysInMonth[newMonth - 1]
newMonth = newMonth + 1
if (newMonth > 12) {
newMonth = 1
newYear = newYear + 1
}
count = count + 1
}
return { year: newYear, month: newMonth, day: newDay }
}
// メイン処理
@misskeyBirthViewer(overrideResultText) {
// USER_ID: 自分のID固定値
let user_id = USER_ID
let limit = 100
let dateLimitMax = 365
var dateLimit = Plugin:config.dateLimit
let dialogTextList = []
if (Plugin:config.dateInputIsEnabled) {
var input = readline(`直近の誕生日のフォロー一覧を取得する日数を入力してください。
本スクリプトはフォローユーザーのみ対象です。フォロワーは対象外です。
リクエストは日単位で実行されます。
1回あたりのインターバルは日数x10msecで長くなるよう設定しています(最大1000msec)。
最小限必要な日数だけを入力してください。
インターバルと処理時間の目安(インターバルを考慮):
- 7日: インターバル約70msec、総インターバル 約490msec
- 14日: インターバル約140msec、総インターバル 約1960msec
- 30日: インターバル約300msec、総インターバル 約9,000msec
- 90日: インターバル約900msec、総インターバル 約81,000msec
- 365日(最大): インターバル最大1000msec、総インターバル 約365,000msec
※入力は半角数字のみ有効です(例: 7)。数値以外の入力は無効となります。`)
if (input == null) return null // ユーザーがキャンセルを選択した場合、ループを抜けて処理を終了
input = input.to_num()
if Core:type(input) == 'error' || input == null return null // 数値でない入力の場合、ループの最初に戻る
// 日付の是正
if (input > dateLimitMax) {
input = dateLimitMax
}
dateLimit = input
}
// インターバルの計算
var interval = dateLimit * 10
if (interval >= 1000) {
interval = 1000
}
if (dateLimit > dateLimitMax) {
dateLimit = dateLimitMax
}
var totalInterval = dateLimit * interval
var totalTimePred = totalInterval * Plugin:config.processTimeCoef
if (dateLimit >= 30) {
var conditionText = `取得日数: {dateLimit}日
インターバル: {interval}msec
総インターバル: {totalInterval}msec = {totalInterval/1000}sec
総処理時間予測※: {totalTimePred}msec = {totalTimePred/1000}sec
※実際の総処理時間は、インターバルの誤差やAPIのレスポンス時間により変動します。`
Mk:dialog(`長期間のデータ取得が指定されました。以下の条件で実行しますので、しばらくお待ちください。` conditionText)
}
var today = {
year: Date:year(),
month: Date:month(),
day: Date:day()
}
// 以下の部分でループしてAPIを呼び出す
var i = 0
loop {
if (i >= dateLimit) break
var newDate = addDays(today, i)
var dateStr = `{newDate.year}-{newDate.month}-{newDate.day}`
// ここにAPIを呼び出す処理を書く
let followingList = getFollowing(user_id, dateStr, limit)
if (followingList.len > 0) {
var followingBirthList = []
if (today.day == newDate.day) && (today.month == newDate.month) {
followingBirthList = getUserBirthList(followingList, true)
if (followingBirthList.len > 0) {
dialogTextList.push(`=== {dateStr} {Plugin:config.birthdayHeaderText} ===`)
dialogTextList.push(`{followingBirthList.join(Str:lf)}{Str:lf}`)
}
} else {
followingBirthList = getUserBirthList(followingList, false)
if (followingBirthList.len > 0) {
if (newDate.day == 1) {
dialogTextList.push(`{Str:lf}=== {dateStr} ===`)
} else {
dialogTextList.push(`--- {dateStr} ---`)
}
dialogTextList.push(followingBirthList.join(Str:lf))
}
}
// リクエストを待つ時間
Core:sleep(interval)
}
i = i + 1
}
Mk:dialog(`直近{dateLimit}日の誕生日のフォロー一覧` dialogTextList.join(Str:lf))
overrideResultText
}
Plugin:register_post_form_action(`[閲覧]直近の誕生日を取得!` @(f u) {u("text" misskeyBirthViewer(f.text))})