-
Notifications
You must be signed in to change notification settings - Fork 0
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
フリーランモードに対応 #4
フリーランモードに対応 #4
Conversation
Walkthroughこの変更は、プロジェクト全体の高レベルな改善を行いました。環境変数のチェック、クラウドストレージからファイルのダウンロード、指定されたパラメータでサーバーを実行し、ログをクラウドストレージにアップロードするスクリプトに関する変更が含まれています。 Changes
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review Status
Actionable comments generated: 7
Configuration used: .coderabbit.yaml
Files selected for processing (19)
- .dockerignore (1 hunks)
- .github/pr-labeler.yml (1 hunks)
- .github/release-drafter.yml (1 hunks)
- .github/workflows/pr_label.yml (1 hunks)
- .github/workflows/release.yml (1 hunks)
- .gitignore (1 hunks)
- Cargo.lock (13 hunks)
- Cargo.toml (1 hunks)
- Dockerfile (1 hunks)
- ai_bridge/src/ai_loader.rs (1 hunks)
- ai_bridge/src/interface.rs (12 hunks)
- ai_bridge/tests/test_func.rs (6 hunks)
- docker-compose.yml (1 hunks)
- install.sh (1 hunks)
- loadlibrary (1 hunks)
- mahjong-app-engine (1 hunks)
- run.sh (1 hunks)
- server/Cargo.toml (1 hunks)
- server/src/main.rs (3 hunks)
Files skipped from review due to trivial changes (4)
- .dockerignore
- Cargo.toml
- loadlibrary
- mahjong-app-engine
Additional comments: 28
.gitignore (1)
- 1-3: .gitignoreファイルに変更が加えられましたが、これらの変更は適切です。
docker-compose.yml (1)
- 4-13:
docker-compose.yml
のapp
サービスのボリュームマッピングで、ホストの現在のディレクトリをコンテナ内の/home/app_copy
にマッピングしていますが、このパスはプロジェクトの構造やDockerfileと整合性が取れているか確認が必要です。.github/workflows/pr_label.yml (1)
- 1-15:
pr_label.yml
の設定は適切に見えますが、実際のラベル名とGitHubリポジトリのラベル設定が一致しているか確認する必要があります。server/Cargo.toml (1)
- 16-17:
Cargo.toml
に追加されたclap
とdotenv
の依存関係は適切です。Dockerfile (1)
- 1-25: Dockerfileの変更は、基本的に適切に見えますが、
RUN cargo build -p server --release --features load-dll
のコマンドでビルドされるバイナリが実際に/home/app/target/release/server
に存在するか確認する必要があります。.github/release-drafter.yml (1)
- 1-31:
release-drafter.yml
の設定は適切に見えます。特に修正する必要はありません。.github/workflows/release.yml (1)
- 1-33:
release.yml
の設定は適切に見えます。GitHub Actionsの設定に関して特に問題はありません。ai_bridge/tests/test_func.rs (1)
- 72-118: > 📝 NOTE
This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [3-167]
test_func.rs
のテストケースにおいて、state.create
やstate.sutehai
の呼び出しに追加の引数が必要になっていますが、これらの変更は適切に行われています。ai_bridge/src/interface.rs (6)
- 40-46:
MJRL_AKA5
の処理において、明示的なブレースの追加が行われていますが、Rustの慣習として、単一の式であればブレースは省略可能です。ただし、この変更はコードの明確性を向上させるために有用かもしれません。- 49-56:
MJRL_SHANYU
の処理において、if-else
ブロックに明示的なブレースが追加されています。この変更はコードの読みやすさを向上させますが、Rustの慣習としては必須ではありません。- 59-66:
MJRL_NANNYU
の処理で、if-else
ブロックにブレースが追加されています。この変更はコードの可読性を高めるものですが、Rustでは単一の式の場合ブレースを省略することが一般的です。- 90-90:
mjsend_message_impl
関数のpstate
パラメータは、可変参照として渡されています。これは、関数内でPaiState
の状態を変更するために必要です。適切な使用です。- 94-99: コメントアウトされた
println!
マクロは、デバッグ目的で使用されていた可能性がありますが、本番コードには含めない方が良いでしょう。不要なコードは削除することを推奨します。- 447-455: LinuxまたはWindows以外のOSで
mjsend_message
関数を使用する場合、PaiState::default()
を使用してpstate
を初期化しています。このアプローチは、上記のMaybeUninit
を使用する方法よりも簡潔で安全です。Cargo.lock (14)
- 85-97: 新しいパッケージ
anstream
とその依存関係が追加されました。これはPRの目的に沿っています。- 99-103: 新しいパッケージ
anstyle
が追加されました。これはPRの目的に沿っています。- 105-111: 新しいパッケージ
anstyle-parse
とその依存関係が追加されました。これはPRの目的に沿っています。- 114-120: 新しいパッケージ
anstyle-query
とその依存関係が追加されました。これはPRの目的に沿っています。- 123-130: 新しいパッケージ
anstyle-wincon
とその依存関係が追加されました。これはPRの目的に沿っています。- 338-346: 新しいパッケージ
clap
とその依存関係が追加されました。これはPRの目的に沿っています。- 348-357: 新しいパッケージ
clap_builder
とその依存関係が追加されました。これはPRの目的に沿っています。- 361-369: 新しいパッケージ
clap_derive
とその依存関係が追加されました。これはPRの目的に沿っています。- 387-391: 新しいパッケージ
colorchoice
が追加されました。これはPRの目的に沿っています。- 463-467: 新しいパッケージ
dotenv
が追加されました。これはPRの目的に沿っています。- 669-673: 新しいパッケージ
heck
が追加されました。これはPRの目的に沿っています。- 1689-1692: 新しいパッケージ
strsim
が追加されました。これはPRの目的に沿っています。- 1970-1973: 新しいパッケージ
utf8parse
が追加されました。これはPRの目的に沿っています。- 1987-1994: 新しいパッケージ
uuid-macro-internal
とその依存関係が追加されました。これはPRの目的に沿っています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review Status
Actionable comments generated: 0
Configuration used: .coderabbit.yaml
Files selected for processing (2)
- install.sh (1 hunks)
- run.sh (1 hunks)
Files skipped from review as they are similar to previous changes (2)
- install.sh
- run.sh
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review Status
Actionable comments generated: 2
Configuration used: .coderabbit.yaml
Files selected for processing (2)
- run.sh (1 hunks)
- server/src/main.rs (3 hunks)
Files skipped from review as they are similar to previous changes (1)
- run.sh
Additional comments: 2
server/src/main.rs (2)
- 148-200: > 📝 NOTE
This review was outside the diff hunks and was mapped to the diff hunk with the greatest overlap. Original lines [120-197]
cmd
関数では、複数のunsafe
ブロックを使用して外部ライブラリとのインタラクションが行われています。unsafe
ブロックの使用は避けられない場合がありますが、これらのブロック内でのエラーハンドリングが重要です。特に、unwrap
を使用する代わりに、エラーが発生した場合に適切なエラーメッセージを提供することで、デバッグを容易にすることが推奨されます。ただし、以前のレビューコメントでunwrap
の使用が意図的であることが確認されているため、この点については追加のアクションは不要です。
- 208-220:
main
関数において、環境変数の読み込み、コマンドライン引数の解析、Sentryの初期化、そしてcmd
関数の呼び出しが行われています。unwrap
を使用している箇所がありますが、これは以前のレビューコメントでSentry通知のために意図的に使用されていることが確認されています。このため、この実装については特に問題はありません。
#[derive(Parser, Debug)] | ||
#[command(author, about, version)] | ||
struct Command { | ||
#[arg(short, long)] | ||
log_path: String, | ||
#[arg(short, long)] | ||
input_dll: String, | ||
#[arg(short, long)] | ||
paiyama_path: Option<String>, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Command
構造体の定義については、コマンドライン引数を解析するための明確な方法を提供しており、適切に実装されています。ただし、フィールドに対するドキュメントコメントがないため、各フィールドの目的がコードから直接読み取りにくい可能性があります。
#[derive(Parser, Debug)]
#[command(author, about, version)]
struct Command {
+ /// ログファイルのパス
#[arg(short, long)]
log_path: String,
+ /// 入力DLLのパス
#[arg(short, long)]
input_dll: String,
+ /// パイ山ファイルのパス(オプション)
#[arg(short, long)]
paiyama_path: Option<String>,
}
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
#[derive(Parser, Debug)] | |
#[command(author, about, version)] | |
struct Command { | |
#[arg(short, long)] | |
log_path: String, | |
#[arg(short, long)] | |
input_dll: String, | |
#[arg(short, long)] | |
paiyama_path: Option<String>, | |
} | |
#[derive(Parser, Debug)] | |
#[command(author, about, version)] | |
struct Command { | |
/// ログファイルのパス | |
#[arg(short, long)] | |
log_path: String, | |
/// 入力DLLのパス | |
#[arg(short, long)] | |
input_dll: String, | |
/// パイ山ファイルのパス(オプション) | |
#[arg(short, long)] | |
paiyama_path: Option<String>, | |
} |
unsafe fn experiment(func: MJPInterfaceFuncP, inst: *mut c_void, play_log: &mut play_log::PlayLog) { | ||
{ | ||
let state = &mut G_STATE; | ||
state.start(play_log); | ||
} | ||
func(inst, MJPI_STARTKYOKU.try_into().unwrap(), 0, 0); | ||
println!("start kyoku end"); | ||
|
||
let mut is_agari = false; | ||
|
||
for _i in 0..18 { | ||
let mut tsumohai_num: usize; | ||
{ | ||
let state = &mut G_STATE; | ||
state.tsumo(play_log); | ||
tsumohai_num = state.players[state.teban as usize] | ||
.tsumohai | ||
.pai_num | ||
.try_into() | ||
.unwrap(); | ||
} | ||
|
||
ensure!(args.len() >= 2, "usage: {} DLLPath", args[0]); | ||
let ret: u32 = func(inst, MJPI_SUTEHAI.try_into().unwrap(), tsumohai_num, 0) | ||
.try_into() | ||
.unwrap(); | ||
let index = ret & 0x3F; | ||
let flag = ret & 0xFF80; | ||
// println!("ret = {} flag = {:04x}", index, flag); | ||
|
||
{ | ||
let state = &mut G_STATE; | ||
/* | ||
{ | ||
let player = &state.players[state.teban as usize]; | ||
for p in &player.tehai { | ||
print!("{}", p); | ||
} | ||
|
||
print!("{}", player.tsumohai); | ||
let shanten = PaiState::from(&player.tehai).get_shanten(0); | ||
println!(" シャンテン数 {}\r", shanten); | ||
} | ||
*/ | ||
|
||
if flag == MJPIR_SUTEHAI { | ||
state.sutehai(play_log, index as usize, false); | ||
} else if flag == MJPIR_REACH { | ||
state.sutehai(play_log, index as usize, true); | ||
} else if flag == MJPIR_TSUMO { | ||
let score: [i32; 4] = [0, 0, 0, 0]; | ||
println!("agari!!!"); | ||
let agari_r = state.tsumo_agari(play_log); | ||
|
||
match agari_r { | ||
Ok(agari) => { | ||
println!("{:?}", agari.yaku); | ||
} | ||
Err(e) => { | ||
println!("{:?}", e); | ||
} | ||
} | ||
|
||
let path = PathBuf::from(&args[1]); | ||
is_agari = true; | ||
func( | ||
inst, | ||
MJPI_ENDKYOKU.try_into().unwrap(), | ||
MJEK_RYUKYOKU.try_into().unwrap(), | ||
std::mem::transmute(score.as_ptr()), | ||
); | ||
break; | ||
} | ||
} | ||
} | ||
|
||
load_ai(&path); | ||
if !is_agari { | ||
println!("流局(;;)"); | ||
let score: [i32; 4] = [-3000, 0, 0, 0]; | ||
func( | ||
inst, | ||
MJPI_ENDKYOKU.try_into().unwrap(), | ||
MJEK_RYUKYOKU.try_into().unwrap(), | ||
std::mem::transmute(score.as_ptr()), | ||
); | ||
let state = &mut G_STATE; | ||
state.nagare(play_log); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
experiment
関数において、unsafe
ブロック内での外部関数の呼び出しやポインタ操作が適切に行われています。ただし、println!
マクロを使用したデバッグ出力が複数存在します。これらは開発中に有用ですが、本番環境のコードでは不要な出力が発生する可能性があるため、削除するか、条件付きコンパイルを使用してデバッグビルド時のみに含めることを検討してください。
- println!("start kyoku end");
+ #[cfg(debug_assertions)]
+ println!("start kyoku end");
- println!("agari!!!");
+ #[cfg(debug_assertions)]
+ println!("agari!!!");
- println!("流局(;;)");
+ #[cfg(debug_assertions)]
+ println!("流局(;;)");
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
unsafe fn experiment(func: MJPInterfaceFuncP, inst: *mut c_void, play_log: &mut play_log::PlayLog) { | |
{ | |
let state = &mut G_STATE; | |
state.start(play_log); | |
} | |
func(inst, MJPI_STARTKYOKU.try_into().unwrap(), 0, 0); | |
println!("start kyoku end"); | |
let mut is_agari = false; | |
for _i in 0..18 { | |
let mut tsumohai_num: usize; | |
{ | |
let state = &mut G_STATE; | |
state.tsumo(play_log); | |
tsumohai_num = state.players[state.teban as usize] | |
.tsumohai | |
.pai_num | |
.try_into() | |
.unwrap(); | |
} | |
ensure!(args.len() >= 2, "usage: {} DLLPath", args[0]); | |
let ret: u32 = func(inst, MJPI_SUTEHAI.try_into().unwrap(), tsumohai_num, 0) | |
.try_into() | |
.unwrap(); | |
let index = ret & 0x3F; | |
let flag = ret & 0xFF80; | |
// println!("ret = {} flag = {:04x}", index, flag); | |
{ | |
let state = &mut G_STATE; | |
/* | |
{ | |
let player = &state.players[state.teban as usize]; | |
for p in &player.tehai { | |
print!("{}", p); | |
} | |
print!("{}", player.tsumohai); | |
let shanten = PaiState::from(&player.tehai).get_shanten(0); | |
println!(" シャンテン数 {}\r", shanten); | |
} | |
*/ | |
if flag == MJPIR_SUTEHAI { | |
state.sutehai(play_log, index as usize, false); | |
} else if flag == MJPIR_REACH { | |
state.sutehai(play_log, index as usize, true); | |
} else if flag == MJPIR_TSUMO { | |
let score: [i32; 4] = [0, 0, 0, 0]; | |
println!("agari!!!"); | |
let agari_r = state.tsumo_agari(play_log); | |
match agari_r { | |
Ok(agari) => { | |
println!("{:?}", agari.yaku); | |
} | |
Err(e) => { | |
println!("{:?}", e); | |
} | |
} | |
let path = PathBuf::from(&args[1]); | |
is_agari = true; | |
func( | |
inst, | |
MJPI_ENDKYOKU.try_into().unwrap(), | |
MJEK_RYUKYOKU.try_into().unwrap(), | |
std::mem::transmute(score.as_ptr()), | |
); | |
break; | |
} | |
} | |
} | |
load_ai(&path); | |
if !is_agari { | |
println!("流局(;;)"); | |
let score: [i32; 4] = [-3000, 0, 0, 0]; | |
func( | |
inst, | |
MJPI_ENDKYOKU.try_into().unwrap(), | |
MJEK_RYUKYOKU.try_into().unwrap(), | |
std::mem::transmute(score.as_ptr()), | |
); | |
let state = &mut G_STATE; | |
state.nagare(play_log); | |
} | |
} | |
unsafe fn experiment(func: MJPInterfaceFuncP, inst: *mut c_void, play_log: &mut play_log::PlayLog) { | |
{ | |
let state = &mut G_STATE; | |
state.start(play_log); | |
} | |
func(inst, MJPI_STARTKYOKU.try_into().unwrap(), 0, 0); | |
#[cfg(debug_assertions)] | |
println!("start kyoku end"); | |
let mut is_agari = false; | |
for _i in 0..18 { | |
let mut tsumohai_num: usize; | |
{ | |
let state = &mut G_STATE; | |
state.tsumo(play_log); | |
tsumohai_num = state.players[state.teban as usize] | |
.tsumohai | |
.pai_num | |
.try_into() | |
.unwrap(); | |
} | |
let ret: u32 = func(inst, MJPI_SUTEHAI.try_into().unwrap(), tsumohai_num, 0) | |
.try_into() | |
.unwrap(); | |
let index = ret & 0x3F; | |
let flag = ret & 0xFF80; | |
// println!("ret = {} flag = {:04x}", index, flag); | |
{ | |
let state = &mut G_STATE; | |
/* | |
{ | |
let player = &state.players[state.teban as usize]; | |
for p in &player.tehai { | |
print!("{}", p); | |
} | |
print!("{}", player.tsumohai); | |
let shanten = PaiState::from(&player.tehai).get_shanten(0); | |
println!(" シャンテン数 {}\r", shanten); | |
} | |
*/ | |
if flag == MJPIR_SUTEHAI { | |
state.sutehai(play_log, index as usize, false); | |
} else if flag == MJPIR_REACH { | |
state.sutehai(play_log, index as usize, true); | |
} else if flag == MJPIR_TSUMO { | |
let score: [i32; 4] = [0, 0, 0, 0]; | |
#[cfg(debug_assertions)] | |
println!("agari!!!"); | |
let agari_r = state.tsumo_agari(play_log); | |
match agari_r { | |
Ok(agari) => { | |
println!("{:?}", agari.yaku); | |
} | |
Err(e) => { | |
println!("{:?}", e); | |
} | |
} | |
is_agari = true; | |
func( | |
inst, | |
MJPI_ENDKYOKU.try_into().unwrap(), | |
MJEK_RYUKYOKU.try_into().unwrap(), | |
std::mem::transmute(score.as_ptr()), | |
); | |
break; | |
} | |
} | |
} | |
if !is_agari { | |
#[cfg(debug_assertions)] | |
println!("流局(;;)"); | |
let score: [i32; 4] = [-3000, 0, 0, 0]; | |
func( | |
inst, | |
MJPI_ENDKYOKU.try_into().unwrap(), | |
MJEK_RYUKYOKU.try_into().unwrap(), | |
std::mem::transmute(score.as_ptr()), | |
); | |
let state = &mut G_STATE; | |
state.nagare(play_log); | |
} | |
} |
Summary by CodeRabbit
新機能
.git
ディレクトリとlogs/
ディレクトリを.dockerignore
ファイルで除外するパターンを追加しました。[profile.release]
セクションに追加しました。app
サービスのビルド設定を更新し、ボリュームマッピングを変更しました。バグ修正
.dll
ファイル、target
という名前のディレクトリ、およびlogs
ディレクトリを無視するルールを導入しました。ドキュメント
リファクタリング
load_ai
関数とget_ai_symbol
関数を更新しました。PaiState
インスタンスを初期化しました。clap::Parser
インポートを追加し、ai_bridge
のインポートと構造体フィールドを修正し、experiment
関数を更新し、main
関数をリファクタリングしました。依存関係の更新
clap
バージョン 4.5.0 とdotenv
バージョン 0.15.0 を追加しました。