Skip to content

Commit

Permalink
Merge pull request #7 from approvers/feat/message-limit-bypass
Browse files Browse the repository at this point in the history
feat: 2000文字超過のレスポンスを返せるように
  • Loading branch information
Meru authored Jul 27, 2023
2 parents d86fe76 + 6e8121a commit 94595fc
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 16 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
/target
.env

# 一時的なテキストファイルの生成に使用する
/temp
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ ichiyoAI は Discord 上で ChatGPI と会話ができる Discord Bot です。

----

- [ ] 2000文字以上のレスポンスに対応する
- [x] 2000文字以上のレスポンスに対応する
- [ ] 会話のコンテキスト維持機能に対応する

## Usage
Expand All @@ -22,7 +22,8 @@ ichiyoAI は Discord 上で ChatGPI と会話ができる Discord Bot です。

ichiyoAI が起動しているBotに対してチャット内容と共にメンションを送信するとレスポンスを返します。

- ChatGPT からのレスポンスが2000文字を超えた場合は表示されません。その場で切り捨てられます。
- ChatGPT からのレスポンスが2000文字を超えた場合はテキストファイルに変換して返信します。
- メッセージのどの位置にメンションを挿入しても反応します。

## Installation

Expand Down
16 changes: 15 additions & 1 deletion src/api/discord.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use serenity::model::prelude::Message;
use serenity::prelude::Context;

pub async fn send_message(ctx: &Context, msg: &Message, content: &str) -> Message {
pub async fn reply(ctx: &Context, msg: &Message, content: &str) -> Message {
msg.reply_ping(ctx, content)
.await
.expect("メッセージの送信に失敗しました。")
Expand All @@ -13,3 +13,17 @@ pub async fn edit_response(ctx: &Context, mut target_message: Message, response:
.await
.expect("メッセージの編集に失敗しました。");
}

pub async fn edit_response_with_file(ctx: &Context, mut target_msg: Message, file_name: &str) {
target_msg
.edit(ctx, |m| {
m.content("レスポンスが2000文字を超えたため、添付ファイルで表示します。")
})
.await
.expect("メッセージの編集に失敗しました。");
target_msg
.channel_id
.send_message(ctx, |m| m.add_file(file_name))
.await
.expect("メッセージの送信に失敗しました。");
}
6 changes: 1 addition & 5 deletions src/events/event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,7 @@ impl EventHandler for Handler {
return;
}

if msg
.mentions
.iter()
.any(|user| user.id == ctx.cache.current_user_id())
{
if let Ok(true) = msg.mentions_me(&ctx).await {
chat_ai(&ctx, msg).await;
}
}
Expand Down
13 changes: 5 additions & 8 deletions src/events/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,19 @@ use serenity::model::prelude::Message;
use serenity::prelude::Context;

use crate::api::chatgpt::chat_completion;
use crate::api::discord::{edit_response, send_message};
use crate::api::discord::{edit_response, edit_response_with_file, reply};
use crate::utils::create_temp_file;

pub async fn chat_ai(ctx: &Context, msg: Message) {
let waiting_message = send_message(ctx, &msg, "思考中... 🤔").await;
let waiting_message = reply(ctx, &msg, "思考中... 🤔").await;

let response = chat_completion(&msg.content).await;
let response_content = &response.message().content;

match response_content.chars().count() {
count if count > 2000 => {
send_message(
ctx,
&msg,
"レスポンスが2000文字を超えたため、表示できません。",
)
.await;
create_temp_file(response_content.to_string());
edit_response_with_file(&ctx, waiting_message, "temp/temp.txt").await;
}
_ => edit_response(&ctx, waiting_message, response_content).await,
}
Expand Down
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use events::event::Handler;

mod api;
mod events;
mod utils;

#[tokio::main]
async fn main() {
Expand Down
19 changes: 19 additions & 0 deletions src/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use std::fs::{create_dir, File};
use std::io::Write;

pub fn create_temp_file(content: String) {
match create_dir("temp") {
Ok(_) => {
println!("一時フォルダを作成しました。");

let mut temp_file =
File::create("temp/temp.txt").expect("一時ファイルの作成に失敗しました。");
temp_file
.write_all(content.as_ref())
.expect("一時ファイルへの書き込みに失敗しました。");

println!("一時ファイルを作成しました。")
}
Err(_) => panic!("一時ディレクトリを作成できませんでした。"),
}
}

0 comments on commit 94595fc

Please sign in to comment.