minecraftからチャットを受信する c#プログラム
表題は少し誤りがあります。minecraftからチャットを受信する機能はありません^^;
代替処理としてログを読み取って受信に代わりにするというものです。@waxsd100様のサイトを参考にさせていただきました。
@waxsd100様の記事⇒バニラのMinecraftでChatGPTに質問したりてコマンド実行する
Pythonで書かれていましたのでアイデアだけ拝借してc#でプログラムしました。ただしログ読み取りの部分は汚いコードになっています。短くて美しいコードに書き直してください。
Minecraftでチャットするとオウム返しをするc#プログラム
Nuget情報
パスワード、IPアドレス、ログの場所は環境に合わせて修正してね。
using MinecraftConnection;
using System.Text.RegularExpressions;
namespace ChatProgram
{
public class Program
{
static private string strSavline = "";
static private bool booSkip = true;
static void Main(string[] args)
{
string strAddress = "127.0.0.1";
ushort shtPort = 25575;
string strPass = "doghouse";
MinecraftCommands MinCmd = new MinecraftCommands(strAddress, shtPort, strPass);
string strline = "";
while (true)
{
strline = ReadLog();
if (strline != null)
{
if (strline.IndexOf(@"<")>0)
{
Match rgxMtc = Regex.Match(strline, @"<.*> (.*)");
Group rgxGrp = rgxMtc.Groups[1];
CaptureCollection colCap = rgxGrp.Captures;
MinCmd.DisplayMessage(colCap[0].Value);
}
}
Thread.Sleep(3000);
}
}
static private string ReadLog()
{
string strline = "";
string strPath = @"E:\MinecraftServer\logs\latest.log";
using (FileStream fs = new FileStream(strPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader sr = new StreamReader(fs))
{
//最初は最終行まで、その後は読み込んだところまで
strline = sr.ReadLine();
while (true)
{
if (sr.Peek() < 0 || !booSkip)
{
if (strSavline == strline)
strline = "";
else
strSavline = strline;
booSkip = true;
break;
}
if (strline == strSavline)
{
booSkip = false;
}
strline = sr.ReadLine();
}
return (strline);
}
}
}
}
}
実行結果
「こんにちは」とチャットすると「こんにちは」と返してきました。
※Littlemaidrebirthのメイドさんをサーバーに入れています