-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Plugins development ko KR
ASF๋ ๋ฐํ์ ์ค ๋ก๋ํ ์ ์๋ ์ฌ์ฉ์ ์ง์ ํ๋ฌ๊ทธ์ธ์ ์ง์ํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ์ง์ ๋ช ๋ น์ด ์ถ๊ฐ, ์ฌ์ฉ์ ์ง์ ๊ฑฐ๋ ๋ก์ง, ํน์ ์๋ํํฐ ์๋น์ค ๋ฐ API์์ ์ ์ฒด ํตํฉ ๋ฑ์ ํตํด ASF์ ๋์์ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค.
์ด ํ์ด์ง์์๋ ๊ฐ๋ฐ์ ๊ด์ ์์ ASF ํ๋ฌ๊ทธ์ธ์ ๋ํด ์ค๋ช ํฉ๋๋ค - ์์ฑ, ์ ์ง ๊ด๋ฆฌ, ๋ฐฐํฌ ๋ฑ์ ๋ค๋ฃน๋๋ค. ์ฌ์ฉ์ ๊ด์ ์์ ๋ณด๊ณ ์ถ์ผ์๋ค๋ฉด **์ฌ๊ธฐ**๋ก ์ด๋ํ์ธ์.
ํ๋ฌ๊ทธ์ธ์ ASF์ ์ ์ธ๋ ๊ณตํต IPlugin ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ์ ์ํ๋ ํ์ค .NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ๋ด๋ถ ASF API๊ฐ ํธํ๋๋ ํ, ๋ฉ์ธ๋ผ์ธ ASF์ ์์ ํ ๋
๋ฆฝ์ ์ผ๋ก ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ๊ณ ํ์ฌ ๋ฐ ํฅํ ASF ๋ฒ์ ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ASF์์ ์ฌ์ฉํ๋ ํ๋ฌ๊ทธ์ธ ์์คํ
์ System.Composition์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ด๋ ์์ ์ **Managed Extensibility Framework**๋ก ์๋ ค์ก๋ ๊ฒ์ผ๋ก, ASF๊ฐ ๋ฐํ์ ์ค ์ฌ์ฉ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒ์ํ๊ณ ๋ก๋ํ ์ ์๊ฒ ํด์ค๋๋ค.
์ฌ๋ฌ๋ถ์ ์ํด **ASF-PluginTemplate**๋ฅผ ์ค๋นํด๋์์ผ๋ฉฐ, ํ๋ฌ๊ทธ์ธ ํ๋ก์ ํธ์ ๋ฒ ์ด์ค๋ก ์ฌ์ฉ(ํ์๋ ๊ฒ์ ๊ถ์ฅ)ํ ์ ์์ต๋๋ค. ํ ํ๋ฆฟ ์ฌ์ฉ์ ํ์๋ ์๋๋ฉฐ(์ฒ์๋ถํฐ ์ง์ ๋ง๋์ ๋ ๋ฉ๋๋ค), ๋ค๋ง ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ๊ณ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ ๊ทน ๊ถ์ฅํฉ๋๋ค. ํ ํ๋ฆฟ์ **README**๋ฅผ ํ์ธํ์๋ฉด ์ดํ ๊ณผ์ ์ ์๋ดํด์ค ๊ฒ์ ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ฒ์๋ถํฐ ์ง์ ์์ํ๊ณ ์ถ์ผ์ ๋ถ๋ค์ด๋ ํ๋ฌ๊ทธ์ธ ํ ํ๋ฆฟ์์ ์ฌ์ฉ๋ ๊ฐ๋ ์ ๋ ๊น์ด ์ดํดํ๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด ์๋์์ ๊ธฐ๋ณธ ์ฌํญ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค - ์ ํฌ ํ๋ฌ๊ทธ์ธ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๊ธฐ๋ก ํ์ จ๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ด ๋ด์ฉ์ ๊ตณ์ด ์ ํ์๋ ์์ต๋๋ค.
ํ๋ก์ ํธ๋ compilation ์น์ ์ ๋ช ์๋ ๋๋ก, ๋์ ASF ๋ฒ์ ์ ๋ง๋ ์ ์ ํ ํ๋ ์์ํฌ๋ฅผ ํ๊ฒํ ํ๋ ํ์ค .NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฌ์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ๋ ๋ฉ์ธ ArchiSteamFarm ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฐธ์กฐํด์ผ ํ๋ฉฐ, ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ๋ก ๋ค์ด๋ก๋ํ ๋ฏธ๋ฆฌ ๋น๋๋ ArchiSteamFarm.dll ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋, ์์ค ํ๋ก์ ํธ(์: ASF ํธ๋ฆฌ๋ฅผ ์๋ธ๋ชจ๋๋ก ์ถ๊ฐํ๊ธฐ๋ก ํ ๊ฒฝ์ฐ)๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ASF์ ๊ตฌ์กฐ, ๋ฉ์๋, ์์ฑ์ ์ ๊ทผํ๊ณ ํ์ฉํ ์ ์์ผ๋ฉฐ, ํนํ ๋ค์ ๋จ๊ณ์์ ์์๋ฐ์์ผ ํ ํต์ฌ IPlugin ์ธํฐํ์ด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ๋ ์ต์ํ System.Composition.AttributedModel๋ ์ฐธ์กฐํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ํตํด IPlugin์ ASF๊ฐ ์ฌ์ฉํ ์ ์๋๋ก [Export]ํ ์ ์์ต๋๋ค. ์ด ์ธ์๋, ์ผ๋ถ ์ธํฐํ์ด์ค์์ ์ ๊ณต๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํด์ํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ ์ถ๊ฑฐ๋ ํ์ํ ์ ์์ง๋ง, ๋ช
์์ ์ผ๋ก ํ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ์ง๊ธ์ ์ด ์ ๋๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
๋ชจ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ csproj๋ ์๋์ ์ ์ฌํ ํํ๊ฐ ๋ ๊ฒ์
๋๋ค:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<!-- Since you're loading plugin into the ASF process, which already includes those dependencies, IncludeAssets="compile" allows you to omit them from the final output -->
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" Version="10.0.0" />
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" Version="10.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="C:\\Path\To\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />
<!-- If building with downloaded DLL binary, use this instead of <ProjectReference> above -->
<!-- <Reference Include="ArchiSteamFarm" HintPath="C:\\Path\To\Downloaded\ArchiSteamFarm.dll" /> -->
</ItemGroup>
</Project>์ฝ๋ ์ธก๋ฉด์์, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ ํด๋์ค๋ ๋ฐํ์ ์ค ASF๊ฐ ์ด๋ฅผ ์ธ์ํ ์ ์๋๋ก IPlugin ์ธํฐํ์ด์ค๋ฅผ ์์ํด์ผ ํฉ๋๋ค(๋ ํนํ๋ ์ธํฐํ์ด์ค, ์๋ฅผ ๋ค์ด IASF๋ฅผ ํตํด ์๋ฌต์ ์ผ๋ก ์์ํ๋ , ๋ช
์์ ์ผ๋ก ์์ํ๋ ์๊ด์์ต๋๋ค) ๊ทธ๋ฆฌ๊ณ [Export(typeof(IPlugin))]๋ ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ถฉ์กฑํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
using System;
using System.Composition;
using System.Threading.Tasks;
using ArchiSteamFarm;
using ArchiSteamFarm.Plugins;
namespace YourNamespace.YourPluginName;
[Export(typeof(IPlugin))]
public sealed class YourPluginName : IPlugin {
public string Name => nameof(YourPluginName);
public Version Version => typeof(YourPluginName).Assembly.GetName().Version;
public Task OnLoaded() {
ASF.ArchiLogger.LogGenericInfo("Hello World!");
return Task.CompletedTask;
}
}ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ค๋ฉด, ๋จผ์ ์ด๋ฅผ ์ปดํ์ผํด์ผ ํฉ๋๋ค. ์ด๋ IDE์์ ์ง์ ํ๊ฑฐ๋, ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค:
# If your project is standalone (no need to define its name since it's the only one)
dotnet publish -c "Release" -o "out"
# If your project is part of ASF source tree (to avoid compiling unnecessary parts)
dotnet publish YourPluginName -c "Release" -o "out"์ดํ, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ๋ฐฐํฌ ์ค๋น๊ฐ ์๋ฃ๋ฉ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ ํํ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ๊ณ ๊ฒ์ํ ์ง๋ ์ ์ ์ผ๋ก ์ฌ๋ฌ๋ถ์ ์ ํ์ด์ง๋ง, ์ปดํ์ผ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ทธ ์ข
์์ฑ(dependencies) ์ ํจ๊ป ๋ด์ zip ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๋ ๋จ์ํ zip ์์นด์ด๋ธ๋ฅผ ์์ ์ plugins ๋๋ ํฐ๋ฆฌ ๋ด ๋
๋ฆฝ๋ ํ์ ๋๋ ํฐ๋ฆฌ์ ์์ถ ํด์ ํ๊ธฐ๋ง ํ๋ฉด ๋๊ณ , ๊ทธ ์ธ์๋ ์๋ฌด๊ฒ๋ ํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ ์์ํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋๋ฆฌ์ค์ผ ๋ฟ์
๋๋ค. ์ ํฌ๋ ์ฌ๋ฌ๋ถ ์์ ์ ํ๋ฌ๊ทธ์ธ ๋ด์์ ์ํํ ์ ์๋ ์์ ์ธํฐํ์ด์ค์ ๋์๋ค์ ์ ์ฉํ ์ฃผ์๊ณผ ํจ๊ป ๋ณด์ฌ์ฃผ๋ ExamplePlugin ํ๋ก์ ํธ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋์ํ๋ ์ฝ๋๋ฅผ ํตํด ๋ฐฐ์ฐ๊ณ ์ถ์ผ์๊ฑฐ๋, ArchiSteamFarm.Plugins ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ์ดํด๋ณด๊ณ ํฌํจ๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ต์
์ ํ์ธํ๊ณ ์ถ์ผ์๋ค๋ฉด ์์ ๋กญ๊ฒ ์ดํด๋ณด์ธ์. ์๋์์ ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋
๋ ๋ ์์ธํ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
์์ ํ๋ฌ๊ทธ์ธ ๋์ ์ค์ ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฐฐ์ฐ๊ณ ์ถ์ผ์๋ค๋ฉด, ์ ํฌ๊ฐ ๊ฐ๋ฐํ ์ฌ๋ฌ ๊ณต์ ํ๋ฌ๊ทธ์ธ๋ค์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ItemsMatcher, MobileAuthenticator, SteamTokenDumper ๊ฐ ์์ต๋๋ค. ์ด ์ธ์๋, ์ ํฌ ์๋ํํฐ ์น์
์๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๊ฐ๋ฐํ ํ๋ฌ๊ทธ์ธ๋ค๋ ์์ต๋๋ค.
ASF๋ ์ธํฐํ์ด์ค ์์ฒด๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ ๋ถ๋ถ ์ธ์๋, ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋ฐ ํ์ฉํ ์ ์๋ ์๋ง์ ๋ด๋ถ API๋ฅผ ๋
ธ์ถํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Steam ์น์ ์๋ก์ด ํํ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์ถ๋ค๋ฉด, ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ ์ง์ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค. ํนํ ์ ํฌ๊ฐ ์ด์ ์ ์ด๋ฏธ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฌ๋ฌ ๋ฌธ์ ๋ค์ ๋ค์ ๋ค๋ฃฐ ํ์๊ฐ ์์ต๋๋ค. ์ธ์ฆ, ์ธ์
๊ฐฑ์ , ์น ์๋ ์ ํ(web limiting) ๋ฑ ์ ์์ค์ ์์
๋ค์ ์ฒ๋ฆฌํด์ฃผ๋ UrlWithSession() ๋ฉ์๋๋ฅผ ์ด๋ฏธ ๋ง์ด ์ ๊ณตํ๋ ์ ํฌ Bot.ArchiWebHandler๋ฅผ ๊ทธ๋ฅ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, Steam ํ๋ซํผ ์ธ๋ถ๋ก ์น ์์ฒญ์ ๋ณด๋ด๊ณ ์ถ๋ค๋ฉด ํ์ค .NET HttpClient ํด๋์ค๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง, ์คํจํ ์์ฒญ ์ฌ์๋ ๋ฑ์์ ๋ค์ ํ ๋ฒ ๋์์ ์ฃผ๋ Bot.ArchiWebHandler.WebBrowser๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ต๋๋ค.
์ ํฌ๋ API ๊ฐ์ฉ์ฑ์ ์์ด ๋งค์ฐ ๊ฐ๋ฐฉ์ ์ธ ์ ์ฑ
์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ASF ์ฝ๋์ ์ด๋ฏธ ํฌํจ๋ ์ด๋ค ๊ฒ์ ํ์ฉํ๊ณ ์ถ์ผ์๋ค๋ฉด, ๊ฐ๋จํ ์ด์๋ฅผ ์ด์ด ASF์ ๋ด๋ถ API์ ๋ํด ๊ณํํ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช
ํด์ฃผ์ธ์. ์ฌ๋ฌ๋ถ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํฉ๋ฆฌ์ ์ธ ํ, ์ ํฌ๋ ๋๋ถ๋ถ ์ด๋ฅผ ๋ฐ๋ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด ์ถ๊ฐํ๋ฉด ์ข์ ๋งํ ์๋ก์ด IPlugin ์ธํฐํ์ด์ค์ ๋ํ ์ ์๋ ๋ชจ๋ ํฌํจํฉ๋๋ค.
๋ค๋ง ASF์ API ๊ฐ์ฉ์ฑ๊ณผ ๊ด๊ณ์์ด, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ์์ฒด์ ์ธ ์ข
์์ฑ์ ๊ฐ์ง ์๋ ์๋ค๋ ์ ์์ ์๋ฌด๊ฒ๋ ์ฌ๋ฌ๋ถ์ ๋ง์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ ํ๋ฆฌ์ผ์ด์
์ Discord.Net ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจ์์ผ ์ฌ๋ฌ๋ถ์ Discord ๋ด๊ณผ ASF ๋ช
๋ น์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๊ฐ๋ฅ์ฑ์ ๋ฌด๊ถ๋ฌด์งํ๋ฉฐ, ์ ํฌ๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ ์์์ ์ต๋ํ์ ์์ ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค. ๋ฐ๋ผ์ ์ธ์์ ์ธ ์ ํ์ ์กด์ฌํ์ง ์์ต๋๋ค - ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ๋ฉ์ธ ASF ํ๋ก์ธ์ค์ ๋ก๋๋๋ฉฐ, C# ์ฝ๋๋ก ํ์ค์ ์ผ๋ก ๊ฐ๋ฅํ ์ด๋ค ์์
์ด๋ ์ํํ ์ ์์ต๋๋ค.
ASF๋ ์๋น์์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ง, ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์์กดํ ์ ์๋ ๊ณ ์ ๋ API ํ๋ฉด์ ๊ฐ์ง ์ ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ๋ ์ ์ ๊ฐ์กฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฆ, ํ ๋ฒ ์ปดํ์ผ๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ์์ผ๋ก ๋์ฌ ๋ชจ๋ ASF ๋ฆด๋ฆฌ์ค์์๋ ๊ณ์ ์ ์ ์๋ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ ํฌ๊ฐ ํ๋ก๊ทธ๋จ์ ๊ณ์ ๋ฐ์ ์์ผ ๋๊ฐ๋ ค๋ ์ด์, ์ด๋ ๋จ์ํ ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํ์ ํธํ์ฑ์ ์ํด ๋์์์ด ๋ณํํ๋ Steam์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํ์ง ๋ชปํ๋ ๊ฒ์ ์ ํฌ ์ํฉ์ ์ ํฉํ์ง ์์ต๋๋ค. ์ด๋ ๋น์ฐํ๊ฒ ๋๊ปด์ง์ค ์๋ ์์ง๋ง, ๊ทธ๋ผ์๋ ๋ช ํํ ์ง๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ ํฌ๋ ASF์ ๊ณต๊ฐ๋ ๋ถ๋ถ์ ์ต๋ํ ์์ ์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด ์ต์ ์ ๋คํ๊ฒ ์ง๋ง, ์ถฉ๋ถํ ์ด์ ๊ฐ ์๋ค๋ฉด ์ ํฌ ์ฌ์ฉ ์ค๋จ(deprecation) ์ ์ฑ
์ ๋ฐ๋ผ ํธํ์ฑ์ ๊นจ๋ ๊ฒ๋ ์ฃผ์ ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๋ ํนํ ASF ์ธํ๋ผ์ ์ผ๋ถ๋ก ์ฌ๋ฌ๋ถ์๊ฒ ๋
ธ์ถ๋ ๋ด๋ถ ๊ตฌ์กฐ(์: ArchiWebHandler)์ ๊ด๋ จํด ํนํ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ํฅํ ASF ๊ฐ์ ์ ์ผํ์ผ๋ก ๊ฐ์ (๋ฐ๋ผ์ ์ฌ์์ฑ)๋ ์ ์์ต๋๋ค. ์ ํฌ๋ ๋ณ๊ฒฝ ๋ก๊ทธ(changelog)์์ ์ด๋ฅผ ์ ์ ํ ์๋ดํ๊ณ , ๋ฐํ์ ์ค ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋(obsolete) ๊ธฐ๋ฅ์ ๋ํด ์ ์ ํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์
๋๋ค. ์ ํฌ๋ ์ฌ์์ฑ ์์ฒด๋ฅผ ์ํด ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ฑํ ์๋๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋ง์ด๋ ASF ๋ฒ์ ์ด ๋จ์ง ๋ฒ์ ๋ฒํธ๊ฐ ๋ ๋๋ค๋ ์ด์ ๋ง์ผ๋ก ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์์ ํ ๋ง๊ฐ๋จ๋ฆฌ์ง๋ ์์ ๊ฒ์ด๋ผ๊ณ ์ด๋ ์ ๋ ํ์ ํ์
๋ ์ข์ง๋ง, ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ฃผ์ํ๊ณ ๊ฐ๋์ฉ ์ ์ ์๋ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋งค์ฐ ์ข์ ์ต๊ด์
๋๋ค.
์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ๋ ๊ฐ์ง ์ข
์์ฑ์ ํฌํจํ๊ฒ ๋ฉ๋๋ค. ๋ด๋ถ API๋ฅผ ์ํ ArchiSteamFarm ์ฐธ์กฐ(์ต์ IPlugin)์, ASF ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ธ์๋๊ธฐ ์ํด ํ์ํ([Export] ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ) System.Composition.AttributedModel์ PackageReference์
๋๋ค. ์ด ์ธ์๋, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์์
์ ๋ฐ๋ผ ๋ ๋ง์ ์ข
์์ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค(์: Discord์ ํตํฉํ๊ธฐ๋ก ํ๋ค๋ฉด Discord.Net ๋ผ์ด๋ธ๋ฌ๋ฆฌ).
๋น๋ ๊ฒฐ๊ณผ๋ฌผ์๋ ํต์ฌ YourPluginName.dll ๋ผ์ด๋ธ๋ฌ๋ฆฌ์, ์ฌ๋ฌ๋ถ์ด ์ฐธ์กฐํ ๋ชจ๋ ์ข
์์ฑ์ด ํจ๊ป ํฌํจ๋ฉ๋๋ค. ์ด๋ฏธ ๋์ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ํ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐํ๋ ๊ฒ์ด๋ฏ๋ก, ASF๊ฐ ์ด๋ฏธ ํฌํจํ๊ณ ์๋ ์ข
์์ฑ(์: ArchiSteamFarm, SteamKit2, AngleSharp)์ ํฌํจํ ํ์๊ฐ ์์ผ๋ฉฐ, ์คํ๋ ค ํฌํจํ์ง ์์์ผ ํฉ๋๋ค. ASF์ ๊ณต์ ๋๋ ์ข
์์ฑ์ ๋น๋์์ ์ ์ธํ๋ ๊ฒ์ด ํ๋ฌ๊ทธ์ธ ๋์์ ์ํ ์ ๋์ ์ธ ํ์ ์ฌํญ์ ์๋์ง๋ง, ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ํ๋ฌ๊ทธ์ธ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๋ ๋์์ ์ฑ๋ฅ๋ ํฅ์์ํฌ ์ ์์ต๋๋ค. ASF๊ฐ ์์ ์ ์ข
์์ฑ์ ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํ๊ณ , ASF๊ฐ ์์ง ๋ชปํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ๋ก๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ASF๊ฐ ํฌํจํ์ง ์๊ฑฐ๋ ์๋ชป๋/ํธํ๋์ง ์๋ ๋ฒ์ ์ผ๋ก ํฌํจํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ํฌํจํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ๋ฐฉ์์
๋๋ค. ๊ทธ ์๋ก๋ ๋น์ฐํ YourPluginName.dll์ด ์์ง๋ง, ์๋ฅผ ๋ค์ด Discord.Net.dll๋ ํด๋น๋ฉ๋๋ค. ASF๋ ์ด๋ฅผ ์์ฒด์ ์ผ๋ก ํฌํจํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. API ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด(์๋ฅผ ๋ค์ด ์ฌ๋ฌ๋ถ์ด ํ๋ฌ๊ทธ์ธ์์ ์์กดํ๋ AngleSharp๊ฐ ํญ์ X ๋ฒ์ ์ด๋๋ก ๋ณด์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ASF๊ฐ ํจ๊ป ์ ๊ณตํ๋ ๋ฒ์ ์ด ์๋๋ผ) ASF์ ๊ณต์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ๋ค๋ก ํฌํจํ๋ ๊ฒ๋ ์ฌ์ ํ ์๋ฏธ๊ฐ ์์ ์ ์์ต๋๋ค. ๋ค๋ง ์ด๋ ๋น์ฐํ ๋ฉ๋ชจ๋ฆฌ/ํฌ๊ธฐ ์ฆ๊ฐ์ ์ฑ๋ฅ ์ ํ๋ผ๋ ๋๊ฐ๋ฅผ ์น๋ฅด๊ฒ ๋๋ฏ๋ก ์ ์คํ๊ฒ ๊ฒํ ํด์ผ ํฉ๋๋ค.
ํ์ํ ์ข
์์ฑ์ด ASF์ ์ด๋ฏธ ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด, ์ csproj ์์์์ ๋ณด์ฌ๋๋ฆฐ ๊ฒ์ฒ๋ผ IncludeAssets="compile"๋ก ํ์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ๋ฌ์๊ฒ ํด๋น ์ฐธ์กฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ๊ฒ์(publish)ํ์ง ์๋๋ก ์ง์ํ ์ ์์ต๋๋ค. ASF๊ฐ ์ด๋ฏธ ์ด๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ASF ํ๋ก์ ํธ๋ฅผ ExcludeAssets="all" Private="false"๋ก ์ฐธ์กฐํ๋ ๊ฒ๋ ํ์ธํ์ค ์ ์๋๋ฐ, ์ด๋ ๋งค์ฐ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค - ์ปดํ์ผ๋ฌ์๊ฒ ASF ๊ด๋ จ ํ์ผ์ ์์ฑํ์ง ๋ง๋ผ๊ณ ์ง์ํ๋ ๊ฒ์
๋๋ค(์ฌ์ฉ์๋ ์ด๋ฏธ ์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค). ์ด๋ ASF ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐํ ๋๋ง ํด๋น๋ฉ๋๋ค. dll ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ ๊ฒฐ๊ณผ๋ฌผ๋ก ASF ํ์ผ์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ ์ค๋ช
์ด ํผ๋์ค๋ฝ๊ณ ์ ๋ชจ๋ฅด์๊ฒ ๋ค๋ฉด, ASF-generic.zip ํจํค์ง์ ์ด๋ค dll ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ ๋ค, ์์ง ํฌํจ๋์ง ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ํฌํจ์ํค์ธ์. ๊ฐ์ฅ ๋จ์ํ ํ๋ฌ๊ทธ์ธ์ ๊ฒฝ์ฐ, ์ด๋ ์ค์ง YourPluginName.dll๋ฟ์ผ ๊ฒ์
๋๋ค. ๋ฐํ์ ์ค ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด, ํด๋น ์ํฅ์ ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ๊ป ํฌํจ์์ผ ์ฃผ์ธ์. ๊ทธ ์ธ ๋ชจ๋ ๋ฐฉ๋ฒ์ด ํตํ์ง ์๋๋ค๋ฉด, ์ธ์ ๋ ๋ชจ๋ ๊ฒ์ ๋ฒ๋ค๋ก ํฌํจํ๊ธฐ๋ก ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ์ข
์์ฑ์ OS๋ณ(OS-specific) ๋น๋์ ์ผํ์ผ๋ก ์์ฑ๋ฉ๋๋ค. ํธ์คํธ์๋ .NET ๋ฐํ์์ด ์กด์ฌํ์ง ์์ผ๋ฉฐ, ASF๋ OS๋ณ ๋น๋์ ํจ๊ป ๋ฒ๋ค๋ ์์ฒด .NET ๋ฐํ์์ ํตํด ์คํ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น๋ ํฌ๊ธฐ๋ฅผ ์ต์ํํ๊ธฐ ์ํด, ASF๋ ๋ค์ดํฐ๋ธ ์ข
์์ฑ์ ๋ค๋ฌ์ด(trim) ํ๋ก๊ทธ๋จ ๋ด์์ ์ค์ ๋ก ๋๋ฌ ๊ฐ๋ฅํ ์ฝ๋๋ง ํฌํจ์ํค๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐํ์์์ ์ฌ์ฉ๋์ง ์๋ ๋ถ๋ถ์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ASF์์ ์ฌ์ฉ๋์ง ์๋ .NET ๊ธฐ๋ฅ์ ์์กดํ๊ณ ์๋ค๋ ์ฌ์ค์ ๊ฐ์๊ธฐ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค๋ฉด, OS๋ณ ๋น๋์์๋ ์ด๋ฅผ ์ ๋๋ก ์คํํ ์ ์์ผ๋ฉฐ ๋ณดํต System.MissingMethodException ๋๋ System.Reflection.ReflectionTypeLoadException์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ์ปค์ง๊ณ ์ ์ ๋ ๋ณต์กํด์ง์๋ก, ๊ฒฐ๊ตญ ์ ํฌ OS๋ณ ๋น๋๊ฐ ๋ค๋ฃจ์ง ์๋ ์์ญ์ ๋ถ๋ชํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด๋ ์ ๋ค๋ฆญ(generic) ๋น๋์์๋ ์ ๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ ๋ค๋ฆญ ๋น๋๋ ์ ์ด์ ๋ค์ดํฐ๋ธ ์ข ์์ฑ์ ๋ค๋ฃจ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค(ํธ์คํธ์ ์์ ํ ์๋ ๋ฐํ์์ด ์์ด ASF๋ฅผ ์คํํฉ๋๋ค). ์ด๊ฒ์ด ๋ฐ๋ก ํ๋ฌ๊ทธ์ธ์ ์ค์ง ์ ๋ค๋ฆญ ๋น๋์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ์ด์ ์ ๋๋ค. ๋ค๋ง ์ด ๊ฒฝ์ฐ OS๋ณ ๋น๋์ ASF๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ์ ์ธ๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ค์ดํฐ๋ธ ์ข ์์ฑ๊ณผ ๊ด๋ จ๋ ๊ฒ์ธ์ง ๊ถ๊ธํ๋ค๋ฉด, ASF ์ ๋ค๋ฆญ ๋น๋์ ํ๋ฌ๊ทธ์ธ์ ๋ก๋ํด์ ์ ์ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฒ์ฆํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ ์ ์๋ํ๋ค๋ฉด, ํ๋ฌ๊ทธ์ธ ์ข ์์ฑ ์์ฒด๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด๋ฉฐ, ๋ค์ดํฐ๋ธ ์ข ์์ฑ์ด ๋ฌธ์ ์ ์์ธ์ ๋๋ค.
์ํ๊น๊ฒ๋, ์ ํฌ๋ OS๋ณ ๋น๋์์ ์ ์ฒด ๋ฐํ์์ ํจ๊ป ๋ฐฐํฌํ ๊ฒ์ธ์ง, ์๋๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ์ ์ ์ธํ ๊ฒ์ธ์ง ์ฌ์ด์์ ์ด๋ ค์ด ์ ํ์ ํด์ผ ํ์ต๋๋ค. ํ์๋ฅผ ์ ํํ๋ฉด ์ ์ฒด ๋น๋ ๋๋น ํฌ๊ธฐ๊ฐ 80MB ์ด์ ์์์ง๋๋ค. ์ ํฌ๋ ํ์๋ฅผ ์ ํํ์ผ๋ฉฐ, ์ํ๊น๊ฒ๋ ์ฌ๋ฌ๋ถ์ด ๋ถ์กฑํ ๋ฐํ์ ๊ธฐ๋ฅ์ ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป ์ง์ ํฌํจ์ํฌ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ๊ฐ (OS๋ณ ๋น๋์์) ์ ์ธ๋ ๋ฐํ์ ๊ธฐ๋ฅ์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด, ์์กดํ๋ ์ ์ฒด .NET ๋ฐํ์์ ํฌํจํด์ผ ํ๋ฉฐ, ์ด๋ ๊ณง ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ generic ASF ๋ฒ์ ์์ ์คํํด์ผ ํ๋ค๋ ์๋ฏธ์
๋๋ค. OS๋ณ ๋น๋์์๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋น๋์๋ ์ฌ๋ฌ๋ถ์ด ํ์๋ก ํ๋ ๋ฐํ์ ๊ธฐ๋ฅ์ด ์์ ๋น ์ ธ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ํ์ฌ .NET ๋ฐํ์์ ์ ํฌ๊ฐ ์ ๊ณตํ ๊ฒ๊ณผ ์ฌ๋ฌ๋ถ์ด ์ ๊ณตํ ์ ์๋ ๋ค์ดํฐ๋ธ ์ข
์์ฑ์ "๋ณํฉ"ํ ์ ์๋ ๋ฅ๋ ฅ์ด ์์ต๋๋ค. ์ธ์ ๊ฐ ๋ฏธ๋์๋ ๊ฐ์ ๋ ์๋ ์์ง๋ง, ํ์ฌ๋ก์๋ ๋จ์ํ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ASF์ OS๋ณ ๋น๋์๋ ์ ํฌ ๊ณต์ ํ๋ฌ๊ทธ์ธ์ ์คํํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์ถ๊ฐ ๊ธฐ๋ฅ๋ง ํฌํจ๋์ด ์์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํจ๊ณผ ๋ณ๊ฐ๋ก, ์ด๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ๋ฌ๊ทธ์ธ๋ค์ ํ์ํ ์ถ๊ฐ ์ข
์์ฑ์ ๋ฒ์๋ ๋ค์ ๋ํ์ค๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์ด ๋ค์ดํฐ๋ธ ์ข
์์ฑ์ ๊ฑฑ์ ํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค - ASF์ ์ ํฌ ๊ณต์ ํ๋ฌ๊ทธ์ธ์ด ์ง์ ํ์๋ก ํ๋ ๋ฒ์๋ฅผ ๋์ด์๋ ํ๋ฌ๊ทธ์ธ๋ง ํด๋น๋ฉ๋๋ค. ์ด๋ ๋ถ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์
๋๋ค. ์ ํฌ ์์ฒด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํด ์ด์ฐจํผ ์ถ๊ฐ ๋ค์ดํฐ๋ธ ์ข
์์ฑ์ ํฌํจํด์ผ ํ๋ค๋ฉด, ์ด๋ฅผ ASF์ ํจ๊ป ์ง์ ๋ฐฐํฌํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์๊ณ , ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ๋ถ์ ์
์ฅ์์๋ ๋ค๋ฃจ๊ธฐ๊ฐ ๋ ์ฌ์์ง๊ธฐ ๋๋ฌธ์
๋๋ค. ์ํ๊น๊ฒ๋, ์ด๊ฒ์ด ํญ์ ์ถฉ๋ถํ ๊ฒ์ ์๋๋ฉฐ, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ด ๋ ํฌ๊ณ ๋ณต์กํด์ง์๋ก ๋ค๋ฌ์ด์ง(trimmed) ๊ธฐ๋ฅ์ ๋ถ๋ชํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ๋ฐ๋ผ์ ์ ํฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ง์ ํ๋ฌ๊ทธ์ธ์ generic ASF ๋ฒ์ ์์๋ง ์คํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. OS๋ณ ASF ๋น๋๊ฐ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฅ์ ํ์ํ ๋ชจ๋ ๊ฒ์ ๊ฐ์ถ๊ณ ์๋์ง ์ง์ ์๋์ผ๋ก ํ์ธํ ์๋ ์์ต๋๋ค - ๋ค๋ง ์ด๋ ์ฌ๋ฌ๋ถ์ ์
๋ฐ์ดํธ๋ฟ๋ง ์๋๋ผ ์ ํฌ ์ชฝ์ ๋ณ๊ฒฝ์ ๋ฐ๋ผ์๋ ๋ฌ๋ผ์ง๋ฏ๋ก, ์ ์ง ๊ด๋ฆฌ๊ฐ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋์ฒด ์ต์ ์ ์ฌ์ฉํ๊ฑฐ๋, ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ ์์์ ์ง์ ์ฌ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ๋๋ฝ๋ ๊ธฐ๋ฅ์ "์ฐํ"ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ๋ค๋ง ์ด๊ฒ์ด ํญ์ ๊ฐ๋ฅํ๊ฑฐ๋ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋ฉฐ, ํนํ ๋๋ฝ๋ ๊ธฐ๋ฅ์ด ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ํฌํจ๋ ์๋ํํฐ ์ข ์์ฑ์์ ๋น๋กฏ๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. OS๋ณ ๋น๋์์ ํ๋ฌ๊ทธ์ธ์ ์คํํ๊ณ ์ด๋ฅผ ์ด๋ป๊ฒ๋ ์๋์ํค๋ ค๊ณ ์๋ํด๋ณผ ์๋ ์์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก๋ ๋๋ฌด ๋ง์ ์๊ณ ๊ฐ ๋ค ์ ์์ต๋๋ค. ํนํ ์ฌ๋ฌ๋ถ์ด ์ํ๋ ๊ฒ์ด ๊ทธ์ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ด์ง, ASF์ ํ๋ฉด(surface)๊ณผ ์จ๋ฆํ๋ ๊ฒ์ด ์๋๋ผ๋ฉด ๋๋์ฑ ๊ทธ๋ ์ต๋๋ค.
ASF๋ ์ฌ๋ฌ๋ถ์ ํ๋ฌ๊ทธ์ธ์ ์๋ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ ๋ ๊ฐ์ง ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค:
-
IGitHubPluginUpdates๋ ์ผ๋ฐ์ ์ธ ASF ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก GitHub ๊ธฐ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค. -
IPluginUpdates๋ ๋ ์ ์์ค์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ๋ ๋ณต์กํ ์ฌ์ฉ์ ์ง์ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค.
์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ด ์๋ํ๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ์ฒดํฌ๋ฆฌ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
RepositoryName์ ์ ์ธํด์ผ ํฉ๋๋ค. ์ด๋ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ ธ์ฌ ์์น๋ฅผ ์ ์ํฉ๋๋ค. - GitHub์์ ์ ๊ณตํ๋ ํ๊ทธ์ ๋ฆด๋ฆฌ์ค๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค. ํ๊ทธ๋ ํ๋ฌ๊ทธ์ธ ๋ฒ์ ์ผ๋ก ํ์ฑ ๊ฐ๋ฅํ ํ์์ด์ด์ผ ํฉ๋๋ค(์:
1.0.0.0). - ํ๋ฌ๊ทธ์ธ์
Version์์ฑ์ ์ด๋ฅผ ๊ฐ์ ธ์จ ํ๊ทธ(tag)์ ์ผ์นํด์ผ ํฉ๋๋ค. ์ฆ,1.2.3.4ํ๊ทธ ์๋์์ ์ ๊ณต๋๋ ๋ฐ์ด๋๋ฆฌ๋1.2.3.4๋ก ํ์๋์ด์ผ ํฉ๋๋ค. - ๊ฐ ํ๊ทธ๋ง๋ค, ํ๋ฌ๊ทธ์ธ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ํฌํจ๋ zip ํ์ผ ๋ฆด๋ฆฌ์ค ์์ฐ(release asset)๊ณผ ํจ๊ป GitHub์ ์ ์ ํ ๋ฆด๋ฆฌ์ค๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.
IPluginํด๋์ค๋ฅผ ํฌํจํ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ zip ํ์ผ ๋ด ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ ์์นํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ํตํด ASF์ ๋ฉ์ปค๋์ฆ์ด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค:
- ํ์ฌ ์ฌ๋ฌ๋ถ ํ๋ฌ๊ทธ์ธ์
Version์ ํ์ธํฉ๋๋ค(์:1.0.1). - GitHub API๋ฅผ ์ฌ์ฉํด
RepositoryName์ ์ฅ์์์ ์ต์tag๋ฅผ ๊ฐ์ ธ์ต๋๋ค(์:1.0.2). -
1.0.2>1.0.1์์ ํ์ธํ๊ณ ,1.0.2ํ๊ทธ์ ๋ฆด๋ฆฌ์ค๋ฅผ ํ์ธํ์ฌ ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ๊ฐ ๋ด๊ธด.zipํ์ผ์ ์ฐพ์ต๋๋ค. - ํด๋น
.zipํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์์ถ์ ํด์ ํ ๋ค, ๊ทธ ๋ด์ฉ์ ์ด์ ์ YourPlugin.dll์ด ์๋ ๋๋ ํฐ๋ฆฌ์ ๋ฃ์ต๋๋ค. - ASF๋ฅผ ์ฌ์์ํ์ฌ
1.0.2๋ฒ์ ์ ํ๋ฌ๊ทธ์ธ์ ๋ก๋ํฉ๋๋ค.
์ถ๊ฐ ์ฐธ๊ณ ์ฌํญ:
- ํ๋ฌ๊ทธ์ธ ์
๋ฐ์ดํธ๋ฅผ ์ํด์๋ ์ ์ ํ ASF ์ค์ ๊ฐ, ์ฆ
PluginsUpdateMode๋ฐ/๋๋PluginsUpdateList๊ฐ ํ์ํ ์ ์์ต๋๋ค. - ์ ํฌ ํ๋ฌ๊ทธ์ธ ํ ํ๋ฆฟ์๋ ์ด๋ฏธ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก, ๋จ์ํ ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ ์ ์ ํ๊ฒ ์ด๋ฆ ๋ณ๊ฒฝ(rename) ํ๊ธฐ๋ง ํ๋ฉด ๋ฐ๋ก ์ ์ ์๋ํฉ๋๋ค.
- ์ต์ ๋ฆด๋ฆฌ์ค์ ํ๋ฆฌ๋ฆด๋ฆฌ์ค๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ
UpdateChannel์ ๋ฐ๋ผ ์ฌ์ฉ๋ฉ๋๋ค. -
CanUpdate๋ผ๋ ๋ถ๋ฆฌ์ธ(boolean) ์์ฑ์ด ์์ด, ํ์์ ๋ฐ๋ผ(์๋ฅผ ๋ค์ด ์ผ์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ถ๊ฑฐ๋ ๊ทธ ๋ฐ์ ์ด์ ๋ก) ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ๋ฌ๋ถ ์ชฝ์์ ๋นํ์ฑํ/ํ์ฑํํ๋๋ก ์ค๋ฒ๋ผ์ด๋ํ ์ ์์ต๋๋ค. - ์๋ก ๋ค๋ฅธ ASF ๋ฒ์ ์ ๋์์ผ๋ก ํ๊ณ ์ถ๋ค๋ฉด, ๋ฆด๋ฆฌ์ค์ ์ฌ๋ฌ ๊ฐ์ zip ํ์ผ์ ํฌํจ์ํฌ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์
GetTargetReleaseAsset()์ remarks ๋ฅผ ์ฐธ๊ณ ํ์ธ์. ์๋ฅผ ๋ค์ด,MyPlugin-V6-0.zip๊ณผMyPlugin.zip์ ํจ๊ป ๋ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐV6.0.x.x๋ฒ์ ์ ASF๋ ์ ์๋ฅผ ์ ํํ๊ณ , ๊ทธ ์ธ ๋ชจ๋ ASF ๋ฒ์ ์ ํ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. - ์ ๋ฐฉ์๋ง์ผ๋ก๋ ๋ถ์กฑํ๊ณ ์ฌ๋ฐ๋ฅธ
.zipํ์ผ์ ์ ํํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ง์ ๋ก์ง์ด ํ์ํ๋ค๋ฉด,GetTargetReleaseAsset()ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด์ ASF๊ฐ ์ฌ์ฉํ ์ํฐํฉํธ๋ฅผ ์ง์ ์ ๊ณตํ ์ ์์ต๋๋ค. - ํ๋ฌ๊ทธ์ธ์ด ์
๋ฐ์ดํธ ์ /ํ์ ์ถ๊ฐ ์์
์ ์ํํด์ผ ํ๋ค๋ฉด,
OnPluginUpdateProceeding()๋ฐ/๋๋OnPluginUpdateFinished()๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ์ ์์ต๋๋ค.
์ด ์ธํฐํ์ด์ค๋, IGithubPluginUpdates๊ฐ ์ฌ๋ฌ๋ถ์๊ฒ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ(์๋ฅผ ๋ค์ด ๋ฒ์ ์ผ๋ก ํ์ฑ๋์ง ์๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ ์ด์ GitHub ํ๋ซํผ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ) ์
๋ฐ์ดํธ์ ๋ํ ์ฌ์ฉ์ ์ง์ ๋ก์ง์ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค.
์ค๋ฒ๋ผ์ด๋ํด์ผ ํ ํจ์๋ ๋จ ํ๋, GetTargetReleaseURL()์ด๋ฉฐ, ์ด ํจ์๋ ๋์ ํ๋ฌ๊ทธ์ธ ์
๋ฐ์ดํธ ์์น์ Uri?๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ASF๋ ์ด ํจ์๊ฐ ํธ์ถ๋ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ํต์ฌ ๋ณ์๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ทธ ์ธ์ ๋๋จธ์ง ํ์ํ ๋ก์ง์ ๋ชจ๋ ์ฌ๋ฌ๋ถ์ด ์ง์ ๊ตฌํํด์ ์ฌ์ฉํด์ผ ํ URL(๋๋ ์
๋ฐ์ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ null)์ ASF์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
๊ทธ ์ธ์๋ GitHub ์
๋ฐ์ดํธ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ฉฐ, URL์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ์๋ .zip ํ์ผ์ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค. OnPluginUpdateProceeding() ๋ฐ OnPluginUpdateFinished() ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|
- ๐ก ํ
- ๐ฌ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
- โ๏ธ ์์ํ๊ธฐ (์ฌ๊ธฐ์๋ถํฐ)
- ๐ฅ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ฒ์ ๋ฑ๋ก๊ธฐ
- ๐ข ๋ช ๋ น์ด
- ๐ ๏ธํธํ์ฑ
- ๐ง ํ๊ฒฝ์ค์
- ๐ด ItemsMatcherPlugin
- ๐ ๊ด๋ฆฌ
- โฑ๏ธ ์ฑ๋ฅ
- ๐ก ์๊ฒฉ ํต์
- ๐ช Steam ๊ฐ์กฑ ๊ณต์
- ๐ ๊ฑฐ๋
- โจ๏ธ ๋ช ๋ น์ค ์ธ์
- ๐ง ์ฌ์ฉ ์ค๋จ
- ๐ณ Docker
- ๐ค ์ถ๊ฐ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
- ๐ ๊ณ ์ฑ๋ฅ ์ค์
- ๐ IPC
- ๐ ํ์งํ
- ๐ ๋ก๊น
- ๐พ ์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ํ๊ฒฝ ์ค์
- ๐ต๐ผโโ๏ธ MonitoringPlugin
- ๐ ํ๋ฌ๊ทธ์ธ
- ๐ ๋ณด์
- โฌ๏ธ SteamTokenDumperPlugin
- ๐ฆ ์๋ ํํฐ
- ๐ต 2๋จ๊ณ ์ธ์ฆ







