ããã«ã¡ã¯ããããã人ã§ãïŒ
ä»æ¥ã¯ã.NET Core äžã§ C# ã䜿çšããŠããããäœæããæ¹æ³ãšãããããªã¢ãŒã ãµãŒããŒã§å®è¡ããæ¹æ³ã説æããèšäºã玹ä»ããŸãã
ãã®èšäºã¯ãèæ¯ãæºå段éãããžãã¯ã®äœæããããã®ãªã¢ãŒã ãµãŒããŒãžã®è»¢éã§æ§æãããŸãã
ãã®èšäºãå€ãã®åå¿è
ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
èæ¯
ããã¯ãã¹ãŠãDiscord ãµãŒããŒã§éãããç ãã¬ç§ã®å€ããå§ãŸããŸããã ç§ã¯æè¿åœŒã«å ãã£ãŠä»¥æ¥ã圌ã®ããšã培åºçã«ç 究ãå§ããŸããã ããã¹ããã£ã³ãã«ãVacaciesããèŠã€ããŠèå³ãæã¡ããããéãããšãããèå³ã®ãªããªãã¡ãŒã®äžã«æ¬¡ã®ãããªãã®ãããããšãããããŸããã
ãããã°ã©ããŒïŒãããéçºè
ïŒã
èŠä»¶ïŒ
- ããã°ã©ãã³ã°èšèªã®ç¥èã
- èªãåŠã¶èœåã
ÐПжелаМОÑïŒ
- ä»ã®äººã®ã³ãŒããç解ããèœåã
- DISCORD æ©èœã®ç¥èã
ç®çïŒ
- ãããéçºã
- ãããã®ãµããŒããšã¡ã³ããã³ã¹ã
ããªãã®ã¡ãªãã:
- 奜ããªãããžã§ã¯ãããµããŒããã圱é¿ãäžããæ©äŒã
- ããŒã ã§åãçµéšãç©ãã
- æ¢åã®ã¹ãã«ãå®èšŒããåäžãããæ©äŒã
ããã«ã¯ããã«èå³ãæã¡ãŸããã ã¯ãã圌ãã¯ãã®ä»äºã«ãéãæã£ãŠããŸããããããªãã«çŸ©åãèŠæ±ããŠããŸããããããŒããã©ãªãªã«äœåãªãã®ã¯å«ãŸããŸããã ããã§ããµãŒããŒç®¡çè
ã«æçŽãæžããWorld of Tanks ã§ãã¬ã€ã€ãŒã®çµ±èšã衚瀺ããããããäœæããããã«äŸé ŒããŸããã
äºå段é
ãã£ã¹ã¯ããã
ãããã®äœæãéå§ããåã«ãDiscord çšã«ããããäœæããå¿
èŠããããŸãã å¿
èŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
- Discordã¢ã«ãŠã³ãã«ãã°ã€ã³ãã
ãªã³ã¯ - [ã¢ããªã±ãŒã·ã§ã³] ã¿ãã§ã[æ°ããã¢ããªã±ãŒã·ã§ã³] ãã¿ã³ãã¯ãªãã¯ãããããã«ååãä»ããŸãã
- ãããã«ãã°ã€ã³ãããèšå®ããªã¹ãã§ãããããã¿ããèŠã€ããŠããã ããŒã¯ã³ãååŸããŸãã
- ããŒã¯ã³ãã©ããã«ä¿åããŸã
Wargaming
ãŸããWargaming API ã«ã¢ã¯ã»ã¹ããã«ã¯ãWargaming ã§ã¢ããªã±ãŒã·ã§ã³ãäœæããå¿ èŠããããŸãã ããã§ãããã¹ãŠãã·ã³ãã«ã§ãã
- Wargaming ã¢ã«ãŠã³ãã«ãã°ã€ã³ããŸã
ãã®ãªã³ã¯ãã - ããã€ã¢ããªã±ãŒã·ã§ã³ãã«ç§»åãããæ°ããã¢ããªã±ãŒã·ã§ã³ãè¿œå ããã¿ã³ãã¯ãªãã¯ããŠãã¢ããªã±ãŒã·ã§ã³ã®ååãæå®ãããã®ã¿ã€ããéžæããŸãã
- ã¢ããªã±ãŒã·ã§ã³IDã®ä¿å
ãœãããŠã§ã¢
éžæã®èªç±ã¯ãã§ã«ãããŸãã Visual Studio ã䜿çšãã人ãRider ã䜿çšãã人ãäžè¬çã«åŒ·åãªäººãããŠãVim ã§ã³ãŒããäœæããŸã (çµå±ã®ãšãããæ¬ç©ã®ããã°ã©ããŒã¯ããŒããŒããã䜿çšããŸãããã?)ã ãã ããDiscord APIãå®è£ ããªãå Žåã¯ãéå ¬åŒC#ã©ã€ãã©ãªãDSharpPlusããå©çšããããšãã§ããŸãã NuGet ããã€ã³ã¹ããŒã«ããããšãããªããžããªãããœãŒã¹ãèªåã§ãã«ãããããšã«ãã£ãŠãã€ã³ã¹ããŒã«ã§ããŸãã
NuGet ããã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããæ¹æ³ãããããªãããŸãã¯å¿ããŠããŸã£ã人åããVisual Studio ã®æé
- [ãããžã§ã¯ã] - [NuGet ããã±ãŒãžã®ç®¡ç] ã¿ãã«ç§»åããŸãã
- ã¬ãã¥ãŒãã¯ãªãã¯ããæ€çŽ¢ãã£ãŒã«ãã«ãDSharpPlusããšå ¥åããŸãã
- ãã¬ãŒã ã¯ãŒã¯ãéžæããŠã€ã³ã¹ããŒã«ããŸãã
- å©çïŒ
æºå段éãçµäºããã®ã§ããããã®äœæã«é²ãããšãã§ããŸãã
ããžãã¯ãæžã
ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯å
šäœã«ã€ããŠã¯èæ
®ããŸããããããã«ããã¡ãã»ãŒãžã®ååãåŠçããæ¹æ³ãšãWargaming API ãåŠçããæ¹æ³ã®ã¿ã瀺ããŸãã
Discord ãããã®æäœã¯ãéçéåæã¿ã¹ã¯ MainTask(string[] args); ãéããŠè¡ãããŸãã
ãã®é¢æ°ãåŒã³åºãã«ã¯ãMain ã§ç»é²ããå¿
èŠããããŸã
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();
次ã«ãããããåæåããå¿ èŠããããŸãã
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
});
ããã§ãtoken ã¯ãããã®ããŒã¯ã³ã§ãã
次ã«ãã©ã ããéããŠãããããå®è¡ããå¿
èŠãããã³ãã³ããèšè¿°ããŸãã
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(âHello, â + e.Author.Username);
}
};
ããã§ã e.Author.Username ã¯ãŠãŒã¶ãŒã®ããã¯ããŒã ãååŸããŸãã
ããããããšã§ã& ã§å§ãŸãã¡ãã»ãŒãžãéä¿¡ãããšãããããæšæ¶ãè¿ããŸãã
ãã®é¢æ°ã®æåŸã«ã await discord.ConnectAsync(); ãšèšè¿°ããå¿ èŠããããŸãã Task.Delay(-1); ãåŸ ã¡ãŸãã
ããã«ãããã¡ã€ã³ã¹ã¬ãããå æããããšãªããããã¯ã°ã©ãŠã³ãã§ã³ãã³ããå®è¡ã§ããããã«ãªããŸãã
次ã«ãWargaming API ãåŠçããå¿ èŠããããŸãã ããã§ã¯ãã¹ãŠãç°¡åã§ããCURL ãªã¯ãšã¹ããäœæããJSON æååã®åœ¢åŒã§å¿çãååŸããããããå¿ èŠãªããŒã¿ãåãåºããŠããããã®ããŒã¿ã«å¯ŸããŠæäœãå®è¡ããŸãã
WargamingAPI ã®äœ¿çšäŸ
public Player FindPlayer(string searchNickname)
{
//https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
Player player = null;
string resultResponse = GetResponse(urlRequest);
dynamic parsed = JsonConvert.DeserializeObject(resultResponse);
string status = parsed.status;
if (status == "ok")
{
int count = parsed.meta.count;
if (count > 0)
{
player = new Player
{
Nickname = parsed.data[0].nickname,
Id = parsed.data[0].account_id
};
}
else
{
throw new PlayerNotFound("ÐгÑПк Ме МайЎеМ");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("ÐОМОЌÑÐŒ ÑÑО ÑОЌвПла ÑÑебÑеÑÑÑ");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("ÐевеÑÐœÑй пПОÑк");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("ÐÑÑÑПй МОкМейЌ");
}
else
{
throw new Exception("Something went wrong.");
}
}
return player;
}
泚æïŒ ãã¹ãŠã®ããŒã¯ã³ãšã¢ããªã±ãŒã·ã§ã³ ID ãã¯ãªã¢ ããã¹ãã§ä¿åããããšã¯ãå³å¯ã«ã¯æšå¥šãããŸããã Discord ã¯ãå°ãªããšãããã®ãããªããŒã¯ã³ãäžçèŠæš¡ã®ãããã¯ãŒã¯ã«äŸµå ¥ãããšãã«çŠæ¢ããæ倧ã§ã¯ãããããæ»æè ã«ãã£ãŠäœ¿çšããå§ããŸãã
VPS - ãµãŒããŒãžã®å±é
ãããã®äœ¿çšãå®äºãããã24 æé幎äžç¡äŒã§çšŒåããŠãããµãŒããŒäžã§ãããããã¹ãããå¿
èŠããããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«ããããå®è¡ãããããã§ãã ã¢ããªã±ãŒã·ã§ã³ããªãã«ãããšããã«ãããããã¹ãªãŒãç¶æ
ã«ãªããŸãã
äžã®äžã«ã¯ Windows ãš Linux ã®äž¡æ¹ã§å€ãã® VPS ãµãŒããŒãååšããŸãããã»ãšãã©ã®å ŽåãLinux ã§ãã¹ãããæ¹ãã¯ããã«å®äŸ¡ã§ãã
DiscordãµãŒããŒäžã§vscale.ioãå§ããããã®ã§ãæ©éãã®äžã«Ubuntuäžã«ä»®æ³ãµãŒããŒãäœæããŠããããã¢ããããŒãããŸããã ãã®ãµã€ããã©ã®ããã«æ©èœãããã«ã€ããŠã¯èª¬æããŸãããããããã®èšå®ã«çŽæ¥é²ã¿ãŸãã
ãŸãã.NET Core ã§æžãããããããå®è¡ããããã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
次ã«ããããã GitHub ãªã©ã® Git ãµãŒãã¹ã«ã¢ããããŒãããVPS ãµãŒããŒã«è€è£œããããä»ã®æ¹æ³ã§ããããããŠã³ããŒãããå¿ èŠããããŸãã ã³ã³ãœãŒã«ã®ã¿ãååšããGUI ã¯ååšããªãããšã«æ³šæããŠãã ããã ãŸã£ããã
ããããããŠã³ããŒããããããããå®è¡ããå¿ èŠããããŸãã ãã®ããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- ãã¹ãŠã®äŸåé¢ä¿ã埩å ããŸã: dotnet list
- ã¢ããªã±ãŒã·ã§ã³ã®ãã«ã: dotnet build name_project.sln -c Release
- ãã«ãããã DLL ã«ç§»åããŸãã
- ãããããããã¡ã€ã«å.dll
ããã§ãšãïŒ ããããå®è¡ãããŠããŸãã ãã ããæ®å¿µãªããããããã³ã³ãœãŒã«ãå æããŠãããVPS ãµãŒããŒããçµäºããã®ã¯ç°¡åã§ã¯ãããŸããã ãŸãããµãŒããŒãåèµ·åããå Žåã¯ãæ°ããæ¹æ³ã§ããããèµ·åããå¿ èŠããããŸãã ãã®ç¶æ³ããæãåºãæ¹æ³ã¯ããã€ããããŸãã ãããã¯ãã¹ãŠãµãŒããŒèµ·åæã®èµ·åã«é¢é£ããŠããŸãã
- å®è¡ã¹ã¯ãªããã/etc/init.dã«è¿œå
- èµ·åæã«å®è¡ãããµãŒãã¹ãäœæããŸãã
ãããã«ã€ããŠè©³ãã説æããããšã«æå³ã¯ãªããšæããŸãããã¹ãŠã¯ã€ã³ã¿ãŒãããäžã§ååã«è©³çŽ°ã«èª¬æãããŠããŸãã
æèŠ
ãã®ä»»åãåŒãåããŠããã£ããšæããŸãã ããã¯ç§ã«ãšã£ãŠåããŠã®ãããéçºçµéšã§ããããC# ãš Linux ã§ã®äœæ¥ã«é¢ããæ°ããç¥èãåŸãããšãã§ããŠããããæããŸãã
DiscordãµãŒããŒãžã®ãªã³ã¯ã§ãã
ããããšãããããŸããïŒ
åºæïŒ habr.com