作ったやつを置いてます
ライセンス:AGPL 3.0
- note_percent.is:https://stormskey.works/play/9hcd0v7fd8
- slot_like.is:https://stormskey.works/play/9gxu8arc58
- stw_vehicle_choice.is:https://stormskey.works/play/9gtlzhow0v
作ったやつを置いてます
ライセンス:AGPL 3.0
@num_to_SI_unit_str(x) { | |
let units_SI = [ | |
"" | |
"k" | |
"M" | |
"G" | |
"T" | |
"P" | |
"E" | |
] | |
let x_str = x.to_str() | |
let len_of_x_str = x_str.len | |
var point_index = x_str.index_of(".") | |
if (point_index == -1) { | |
point_index = len_of_x_str | |
} | |
if (point_index <= 0) { | |
return x_str | |
} | |
let x_of_log1000 = Math:floor((point_index - 1) / 3) | |
let next_point_index = point_index - x_of_log1000 * 3 | |
let next_str_decimal = if point_index != len_of_x_str { } else {""} | |
let unit = units_SI[x_of_log1000] | |
let turncate_point = next_point_index + Math:max(1, Math:min(3 - next_point_index, 3)) | |
let result_int_part = x_str.slice(0, next_point_index) | |
let result_dec_part = `{x_str.slice(0,point_index)}{x_str.slice(point_index+1,len_of_x_str)}`.slice(next_point_index, turncate_point) | |
let point = if result_dec_part.len != 0 { "." } else { "" } | |
return `{result_int_part}{point}{result_dec_part}{unit}` | |
} | |
@retrieve() { | |
if (USER_ID == null) { | |
return { | |
is_error: true | |
reason: "ログインしてください" | |
} | |
} | |
let server_stats = Mk:api("stats", {}) | |
let user_stats = Mk:api("users/show", { userId: USER_ID }) | |
return { | |
is_error: false | |
username: USER_USERNAME | |
percentage: num_to_SI_unit_str(100 * user_stats.notesCount / server_stats.originalNotesCount) | |
note_count_user: num_to_SI_unit_str(user_stats.notesCount) | |
note_count_server: num_to_SI_unit_str(server_stats.originalNotesCount) | |
} | |
} | |
@render(state){ | |
@renderError(state) { | |
Ui:render([ | |
Ui:C:mfm({ text: state.reason }) | |
]) | |
Mk:dialog(state.reason, "", "error") | |
} | |
@renderResult(state) { | |
let result = `@{state.username} のノートは…このサーバーの **{state.percentage}%** ({state.note_count_user} / {state.note_count_server})です!{Str:lf}#あなたのノートの割合` | |
Ui:render([ | |
Ui:C:container({ | |
align: 'center' | |
children: [ | |
Ui:C:mfm({ text: `{result}` }) | |
Ui:C:postFormButton({ | |
text: "投稿する" | |
rounded: true | |
primary: true | |
form: { | |
text: `{result}{Str:lf}{THIS_URL}` | |
} | |
}) | |
] | |
}) | |
]) | |
} | |
if (state.is_error) { | |
renderError(state) | |
} else { | |
renderResult(state) | |
} | |
} | |
render(retrieve()) |
/// @ 0.13.3 | |
// スロット的なやつ | |
let final_text = ["A", "B", "C"] | |
let HASHTAG = "#YEAH" | |
let OPEN_DELAY = 800 | |
var opened = 0 | |
var stopTimer = null | |
@openUp() { | |
updateUi(opened) | |
if (opened == final_text.len) { | |
stopTimer() | |
} else { | |
opened += 1 | |
} | |
} | |
@updateUi(opened) { | |
let display_chars = [] | |
for (let i, final_text.len) { | |
if (i < opened) { | |
display_chars.push(final_text[i]) | |
} else { | |
display_chars.push(`$[blur {final_text[i]}]`) | |
} | |
} | |
let display_text = display_chars.join() | |
let display_text_framed = `$[x2 {display_text}]{Str:lf}{HASHTAG}` | |
let display_text_postable = `{display_text_framed}{Str:lf}{THIS_URL}` | |
let children = [ Ui:C:mfm({ text: display_text_framed }) ] | |
if (opened == final_text.len) { | |
children.push( | |
Ui:C:postFormButton({ | |
text: "投稿する" | |
rounded: true | |
primary: true | |
form: { text: display_text_postable } | |
}) | |
) | |
} | |
Ui:render([Ui:C:container({align: 'center', children: children})]) | |
} | |
stopTimer = Async:interval(OPEN_DELAY, openUp, false) | |
updateUi(0) |
/// @ 0.13.3 | |
// ユーザーごとに日替わりのおみくじのプリセットを元に改造 | |
@choose(random, choices) { | |
return choices[random(0 (choices.len - 1))] | |
} | |
let name = "" | |
let user_id = "" | |
if (USER_ID != null) { | |
name = `@{USER_USERNAME}` | |
user_id = `{USER_ID}` | |
} else { | |
let guest_id = Math:rnd(1, 100) | |
name = `ゲスト{guest_id}` | |
user_id = `guest_{guest_id}` | |
} | |
// 選択肢 | |
let vehicle_types = [ | |
"自動車" | |
"列車" | |
"船" | |
"潜水艇" | |
"飛行機" | |
"ヘリ" | |
] | |
let vehicle_powerunits = [ | |
"石炭炉" | |
"原子炉" | |
"ディーゼル炉" | |
"ディーゼルエンジン" | |
"ジェットエンジン" | |
"バッテリー" | |
] | |
let message_templates = [ | |
["今日の", "さんは", "を作ってください!動力源は", "です!"] | |
["今日の", "さんは", "を作ってみると運勢アップするかも?ラッキーアイテムは", "だって!"] | |
["", "さんは今日、", "を作ってみるのはどうでしょうか?", "を使うのがおすすめです"] | |
] | |
// シードが「ユーザーID+今日の日付」である乱数生成器を用意 | |
let seed = `{user_id}{Date:year()}{Date:month()}{Date:day()}` | |
let random = Math:gen_rng(seed) | |
// ランダムに選択肢を選ぶ | |
let chosen_type = choose(random, vehicle_types) | |
let chosen_powerunit = choose(random, vehicle_powerunits) | |
let chosen_msg_template = choose(random, message_templates) | |
// 結果のテキスト | |
let m0 = chosen_msg_template[0] | |
let m1 = chosen_msg_template[1] | |
let m2 = chosen_msg_template[2] | |
let m3 = chosen_msg_template[3] | |
let tag = "#日替わりビークルおみくじ" | |
let result = `{m0}{name}{m1}**{chosen_type}**{m2}**{chosen_powerunit}**{m3}{Str:lf}{tag}` | |
// UIを表示 | |
Ui:render([ | |
Ui:C:container({ | |
align: 'center' | |
children: [ | |
Ui:C:mfm({ text: result }) | |
Ui:C:postFormButton({ | |
text: "投稿する" | |
rounded: true | |
primary: true | |
form: { | |
text: `{result}{Str:lf}{THIS_URL}` | |
} | |
}) | |
] | |
}) | |
]) |