////////////////////////////
// AIにゃんぷっぷー
//
// 2023.04.27 作成
// 2023.04.28 にゃんぷっぷーを選べる機能追加
// 2023.04.30 符号を選べる機能追加
////////////////////////////
let THIS_TAG = "#AIにゃんぷっぷー"
let HUKIDASI_LEFT = ":left_side_balloon_with_tail:"
let HUKIDASI_RIGHT = ":right_side_balloon_without_tail:"
let WORDS = ["にゃ" "にゃあ" "にゃん"]
let NYANPUPPUS = [
":blobcatphoto:"
":meowawauu:"
"$[flip :blobcataww:]"
"$[flip :meowsurprised:]"
"$[flip :blobcatuwu:]"
"$[flip :blobcatmlem:]"
"$[flip :meowmelt:]"
"$[flip :blobcatthinking:]"
"$[flip :meow_wink:]"
":meowtilt:"
":blobcat_frustration:"
":blobcatrainbow:"
]
let HUGOUS = ["!" "?" "。" "..." "...!" "...?"]
var selectedNyanpuppuIndex = 0
var selectedNyanpuppu = NYANPUPPUS[selectedNyanpuppuIndex]
var selectedHugouIndex = 0
var selectedHugou = HUGOUS[selectedHugouIndex]
var situmon = ``
var kotae = `ぷにゃ`
var kotaeList = []
var addedKotae = ``
var flgRun = false
@resetKotae() {
kotae = ``
kotaeList = []
addedKotae = ``
}
// 質問を入力した時の処理
@onInputSitumon(text) {
// 送信済みの場合何もしない
if (flgRun) return false
situmon = text
// 質問が空欄になったときに送信ボタンを押せなくする
if (situmon != "") changeButtonDisabled(false)
else changeButtonDisabled(true)
}
// 送信ボタンを押したときの処理
@onClickSend() {
resetKotae()
changeAreaPostFormHidden(true)
changeAreaOptionHidden(true)
flgRun = true
changeButtonDisabled(true)
createKotae()
result()
}
@genKotae() {
return `{selectedNyanpuppu}{HUKIDASI_LEFT} {kotae}{selectedHugou} {HUKIDASI_RIGHT}`
}
// 投稿内容を生成
@genForm() {
return [
`{HUKIDASI_LEFT} {situmon} {HUKIDASI_RIGHT}`
``
genKotae()
``
`{THIS_TAG}`
`{THIS_URL}`
].join(Str:lf)
}
@genMfmNyanpuppuList() {
var mfm = ""
each (let nyanpuppu, NYANPUPPUS) {
if (nyanpuppu == selectedNyanpuppu) mfm = `{mfm}$[jump {nyanpuppu}]`
else mfm = `{mfm}{nyanpuppu}`
}
return mfm
}
@genMfmHugouList() {
var mfm = ""
each (let hugou, HUGOUS) {
if (hugou == selectedHugou) mfm = `{mfm} $[fg $[jump {hugou}]]`
else mfm = `{mfm} {hugou}`
}
return mfm
}
// 送信ボタンの無効状態の更新
@changeButtonDisabled(b) {
Ui:get("btnSend").update({disabled: b})
}
@changeAreaPostFormHidden(b) {
Ui:get("areaPostForm").update({hidden: b})
}
@changeAreaOptionHidden(b) {
Ui:get("areaOption").update({hidden: b})
}
@changeNyanpuppu(buff) {
selectedNyanpuppuIndex += buff
if (selectedNyanpuppuIndex < 0) selectedNyanpuppuIndex = NYANPUPPUS.len-1
elif (selectedNyanpuppuIndex >= NYANPUPPUS.len) selectedNyanpuppuIndex = 0
selectedNyanpuppu = NYANPUPPUS[selectedNyanpuppuIndex]
updateMfmNyanpuppuList()
updateMfmKotae()
updatePostForm()
}
@changeHugou(buff) {
selectedHugouIndex += buff
if (selectedHugouIndex < 0) selectedHugouIndex = HUGOUS.len-1
elif (selectedHugouIndex >= HUGOUS.len) selectedHugouIndex = 0
selectedHugou = HUGOUS[selectedHugouIndex]
updateMfmHugouList()
updateMfmKotae()
updatePostForm()
}
// 画面に答えを表示する
@addMfmKotae(s) {
addedKotae = `{addedKotae}{s}`
Ui:get("mfmKotae").update({text: `{selectedNyanpuppu}{HUKIDASI_LEFT} {addedKotae} {HUKIDASI_RIGHT}`})
}
@updateMfmKotae() {
Ui:get("mfmKotae").update({text: genKotae()})
}
@updatePostForm() {
Ui:get("btnPostForm").update({form: {text: genForm()}})
}
@updateMfmNyanpuppuList() {
Ui:get("mfmNyanpuppuList").update({text: genMfmNyanpuppuList()})
}
@updateMfmHugouList() {
Ui:get("mfmHugouList").update({text: genMfmHugouList()})
}
// 答えを生成する
@createKotae() {
// 質問が空欄でない場合
if (situmon != "") {
var loopN = Math:rnd(2 6)
var n = 0
var ten = 0
for (let i, loopN) {
n = Math:rnd(0 WORDS.len)
kotae = `{kotae}{WORDS[n]}`
// 最後のループでなければ「、」を確率で付与する。
if (i < (loopN - 1)) {
ten = Math:rnd(0 3)
if (ten == 0) {
kotae = `{kotae}、ぷ`
}
}
}
} else {
situmon = "・・・"
kotae = WORDS[0]
}
kotae = `ぷ{kotae}`
kotaeList = kotae.split("")
kotaeList.reverse()
}
// 結果処理
@result() {
// ChatGPTのサイトのように答えを表示する
// 1文字ずつに分割した答えのリストに値が入ってる場合
if (kotaeList.len > 0) {
var s = kotaeList.pop()
addMfmKotae(s)
Async:timeout(100, result)
} else {
addMfmKotae(selectedHugou)
updatePostForm()
changeAreaPostFormHidden(false)
changeAreaOptionHidden(false)
flgRun = false
changeButtonDisabled(false)
}
}
// 初期表示
@render() {
Ui:render([
Ui:C:container({
align: "center"
children: [
Ui:C:mfm({text: ":nyanpuppu:に質問してみよう!"})
Ui:C:textInput({
onInput: onInputSitumon
})
Ui:C:button({
text: "送信"
disabled: true
onClick: onClickSend
} "btnSend")
Ui:C:mfm({text: " "})
Ui:C:mfm({text: genKotae()} "mfmKotae")
Ui:C:mfm({text: " "})
]
})
Ui:C:container({
align: "center"
hidden: true
children: [
Ui:C:postFormButton({
text: "投稿する"
primary: true
rounded: true
} "btnPostForm")
]
} "areaPostForm")
Ui:C:container({
align: "center"
children: [
Ui:C:mfm({text: ""})
Ui:C:mfm({text: "- にゃんぷっぷーを変える -"})
Ui:C:mfm({text: genMfmNyanpuppuList()} "mfmNyanpuppuList")
Ui:C:buttons({
buttons: [
{
text: "←"
onClick: @(){changeNyanpuppu(-1)}
}
{
text: "→"
onClick: @(){changeNyanpuppu(1)}
}
]
})
Ui:C:mfm({text: "- 符号を変える -"})
Ui:C:mfm({text: genMfmHugouList()} "mfmHugouList")
Ui:C:buttons({
buttons: [
{
text: "←"
onClick: @(){changeHugou(-1)}
}
{
text: "→"
onClick: @(){changeHugou(1)}
}
]
})
]
} "areaOption")
])
}
render()