You can now choose port

where shard communication is happening. JSON explanations with instructions on how to ed
it optional shard settings
This commit is contained in:
Master Kwoth 2017-06-25 06:09:23 +02:00
parent 902ddc70f6
commit ee8643bf29
10 changed files with 71 additions and 22 deletions

View File

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.26430.6 VisualStudioVersion = 15.0.26430.12
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04929013-5BAB-42B0-B9B2-8F2BB8F16AF2}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04929013-5BAB-42B0-B9B2-8F2BB8F16AF2}"
EndProject EndProject

View File

@ -17,7 +17,8 @@ If you do not see `credentials.json` you will need to rename `credentials_exampl
"MashapeKey": "4UrKpcWXc2mshS8RKi00000y8Kf5p1Q8kI6jsn32bmd8oVWiY7", "MashapeKey": "4UrKpcWXc2mshS8RKi00000y8Kf5p1Q8kI6jsn32bmd8oVWiY7",
"OsuApiKey": "4c8c8fdff8e1234581725db27fd140a7d93320d6", "OsuApiKey": "4c8c8fdff8e1234581725db27fd140a7d93320d6",
"Db": null, "Db": null,
"TotalShards": 1 "TotalShards": 1,
"ShardRunCommand": ""
} }
``` ```
----- -----
@ -143,14 +144,29 @@ It should look like:
- **TotalShards** - **TotalShards**
- Required if the bot will be connected to more than 1500 servers. - Required if the bot will be connected to more than 1500 servers.
- Most likely unnecessary to change until your bot is added to more than 1500 servers. - Most likely unnecessary to change until your bot is added to more than 1500 servers.
- **ShardRunCommand**
- Required if you're sharding your bot on windows using .exe, or in a custom way.
- This internally defaults to `dotnet`
- For example, if you want to shard your NadekoBot which you installed using windows installer, you would want to set it to something like this: `C:\Program Files\NadekoBot\system\NadekoBot.exe`
- **ShardRunArguments**
- Required if you're sharding your bot on windows using .exe, or in a custom way.
- This internally defaults to `run -c Release -- {0} {1} {2}` which will be enough to run linux and other 'from source' setups
- {0} will be replaced by the `shard ID` of the shard being ran, {1} by the shard 0's process id, and {2} by the port shard communication is happening on
- If shard0 (main window) is closed, all other shards will close too
- For example, if you want to shard your NadekoBot which you installed using windows installer, you would want to set it to `{0} {1} {2}`
- **ShardRunPort**
- Bot uses a random UDP port in [5000, 6000) range for communication between shards
----- -----
## DB files ## DB files
Nadeko saves all the settings and infomations in `NadekoBot.db` file here: Nadeko saves all the settings and infomations in `NadekoBot.db` file here:
**On linux**
`NadekoBot\src\NadekoBot\bin\Release\netcoreapp1.1\data\NadekoBot.db` (NadekoBot v1.4x) `NadekoBot\src\NadekoBot\bin\Release\netcoreapp1.1\data\NadekoBot.db` (NadekoBot v1.4x)
in order to open the database file you will need [DB Browser for SQLite](http://sqlitebrowser.org/). **On windows**
`[INSTALL_PATH]\NadekoBot\system\data\NadekoBot.db`
In order to open the database file you will need [DB Browser for SQLite](http://sqlitebrowser.org/).
To make changes To make changes

View File

@ -9,13 +9,20 @@ namespace NadekoBot.DataStructures.ShardCom
{ {
public class ShardComClient public class ShardComClient
{ {
private int port;
public ShardComClient(int port)
{
this.port = port;
}
public async Task Send(ShardComMessage data) public async Task Send(ShardComMessage data)
{ {
var msg = JsonConvert.SerializeObject(data); var msg = JsonConvert.SerializeObject(data);
using (var client = new UdpClient()) using (var client = new UdpClient())
{ {
var bytes = Encoding.UTF8.GetBytes(msg); var bytes = Encoding.UTF8.GetBytes(msg);
await client.SendAsync(bytes, bytes.Length, IPAddress.Loopback.ToString(), ShardComServer.Port).ConfigureAwait(false); await client.SendAsync(bytes, bytes.Length, IPAddress.Loopback.ToString(), port).ConfigureAwait(false);
} }
} }
} }

View File

@ -9,8 +9,12 @@ namespace NadekoBot.DataStructures.ShardCom
{ {
public class ShardComServer : IDisposable public class ShardComServer : IDisposable
{ {
public const int Port = 5664; private readonly UdpClient _client;
private readonly UdpClient _client = new UdpClient(Port);
public ShardComServer(int port)
{
_client = new UdpClient(port);
}
public void Start() public void Start()
{ {

View File

@ -65,9 +65,9 @@ namespace NadekoBot
public int ShardId { get; } public int ShardId { get; }
public ShardsCoordinator ShardCoord { get; private set; } public ShardsCoordinator ShardCoord { get; private set; }
private readonly ShardComClient _comClient = new ShardComClient(); private readonly ShardComClient _comClient;
public NadekoBot(int shardId, int parentProcessId) public NadekoBot(int shardId, int parentProcessId, int? port = null)
{ {
if (shardId < 0) if (shardId < 0)
throw new ArgumentOutOfRangeException(nameof(shardId)); throw new ArgumentOutOfRangeException(nameof(shardId));
@ -79,6 +79,10 @@ namespace NadekoBot
TerribleElevatedPermissionCheck(); TerribleElevatedPermissionCheck();
Credentials = new BotCredentials(); Credentials = new BotCredentials();
port = port ?? Credentials.ShardRunPort;
_comClient = new ShardComClient(port.Value);
Db = new DbService(Credentials); Db = new DbService(Credentials);
using (var uow = Db.UnitOfWork) using (var uow = Db.UnitOfWork)
@ -108,7 +112,7 @@ namespace NadekoBot
Currency = new CurrencyService(BotConfig, Db); Currency = new CurrencyService(BotConfig, Db);
GoogleApi = new GoogleApiService(Credentials); GoogleApi = new GoogleApiService(Credentials);
SetupShard(shardId, parentProcessId); SetupShard(shardId, parentProcessId, port.Value);
#if GLOBAL_NADEKO #if GLOBAL_NADEKO
Client.Log += Client_Log; Client.Log += Client_Log;
@ -411,7 +415,7 @@ namespace NadekoBot
} }
} }
private void SetupShard(int shardId, int parentProcessId) private void SetupShard(int shardId, int parentProcessId, int port)
{ {
if (shardId != 0) if (shardId != 0)
{ {
@ -432,7 +436,7 @@ namespace NadekoBot
} }
else else
{ {
ShardCoord = new ShardsCoordinator(); ShardCoord = new ShardsCoordinator(port);
} }
} }
} }

View File

@ -4,8 +4,13 @@
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
if (args.Length == 2 && int.TryParse(args[0], out int shardId) && int.TryParse(args[1], out int parentProcessId)) if (args.Length == 3 && int.TryParse(args[0], out int shardId) && int.TryParse(args[1], out int parentProcessId))
new NadekoBot(shardId, parentProcessId).RunAndBlockAsync(args).GetAwaiter().GetResult(); {
int? port = null;
if (int.TryParse(args[2], out var outPort))
port = outPort;
new NadekoBot(shardId, parentProcessId, outPort).RunAndBlockAsync(args).GetAwaiter().GetResult();
}
else else
new NadekoBot(0, 0).RunAndBlockAsync(args).GetAwaiter().GetResult(); new NadekoBot(0, 0).RunAndBlockAsync(args).GetAwaiter().GetResult();
} }

View File

@ -34,6 +34,7 @@ namespace NadekoBot.Services.Impl
public string PatreonAccessToken { get; } public string PatreonAccessToken { get; }
public string ShardRunCommand { get; } public string ShardRunCommand { get; }
public string ShardRunArguments { get; } public string ShardRunArguments { get; }
public int ShardRunPort { get; }
public BotCredentials() public BotCredentials()
{ {
@ -65,11 +66,16 @@ namespace NadekoBot.Services.Impl
PatreonAccessToken = data[nameof(PatreonAccessToken)]; PatreonAccessToken = data[nameof(PatreonAccessToken)];
ShardRunCommand = data[nameof(ShardRunCommand)]; ShardRunCommand = data[nameof(ShardRunCommand)];
ShardRunArguments = data[nameof(ShardRunArguments)]; ShardRunArguments = data[nameof(ShardRunArguments)];
if (string.IsNullOrWhiteSpace(ShardRunCommand)) if (string.IsNullOrWhiteSpace(ShardRunCommand))
ShardRunCommand = "dotnet"; ShardRunCommand = "dotnet";
if (string.IsNullOrWhiteSpace(ShardRunArguments)) if (string.IsNullOrWhiteSpace(ShardRunArguments))
ShardRunArguments = "run -c Release -- {0} {1}"; ShardRunArguments = "run -c Release -- {0} {1} {2}";
var portStr = data[nameof(ShardRunPort)];
if (string.IsNullOrWhiteSpace(portStr))
ShardRunPort = new NadekoRandom().Next(5000, 6000);
else
ShardRunPort = int.Parse(portStr);
int ts = 1; int ts = 1;
int.TryParse(data[nameof(TotalShards)], out ts); int.TryParse(data[nameof(TotalShards)], out ts);
@ -115,7 +121,10 @@ namespace NadekoBot.Services.Impl
public DBConfig Db { get; set; } = new DBConfig("sqlite", "Filename=./data/NadekoBot.db"); public DBConfig Db { get; set; } = new DBConfig("sqlite", "Filename=./data/NadekoBot.db");
public int TotalShards { get; set; } = 1; public int TotalShards { get; set; } = 1;
public string PatreonAccessToken { get; set; } = ""; public string PatreonAccessToken { get; set; } = "";
public string ShardRunCommand { get; set; } = ""; public string ShardRunCommand { get; set; } = "";
public string ShardRunArguments { get; set; } = "";
public int? ShardRunPort { get; set; } = null;
} }
private class DbModel private class DbModel

View File

@ -17,7 +17,7 @@ namespace NadekoBot.Services.Impl
private readonly IBotCredentials _creds; private readonly IBotCredentials _creds;
private readonly DateTime _started; private readonly DateTime _started;
public const string BotVersion = "1.43"; public const string BotVersion = "1.5";
public string Author => "Kwoth#2560"; public string Author => "Kwoth#2560";
public string Library => "Discord.Net"; public string Library => "Discord.Net";

View File

@ -20,16 +20,18 @@ namespace NadekoBot
private readonly Logger _log; private readonly Logger _log;
private readonly ShardComServer _comServer; private readonly ShardComServer _comServer;
private readonly int _port;
public ShardsCoordinator() public ShardsCoordinator(int port)
{ {
LogSetup.SetupLogger(); LogSetup.SetupLogger();
Credentials = new BotCredentials(); Credentials = new BotCredentials();
ShardProcesses = new Process[Credentials.TotalShards]; ShardProcesses = new Process[Credentials.TotalShards];
Statuses = new ShardComMessage[Credentials.TotalShards]; Statuses = new ShardComMessage[Credentials.TotalShards];
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
_port = port;
_comServer = new ShardComServer(); _comServer = new ShardComServer(port);
_comServer.Start(); _comServer.Start();
_comServer.OnDataReceived += _comServer_OnDataReceived; _comServer.OnDataReceived += _comServer_OnDataReceived;
@ -51,7 +53,7 @@ namespace NadekoBot
var p = Process.Start(new ProcessStartInfo() var p = Process.Start(new ProcessStartInfo()
{ {
FileName = Credentials.ShardRunCommand, FileName = Credentials.ShardRunCommand,
Arguments = string.Format(Credentials.ShardRunArguments, i, curProcessId) Arguments = string.Format(Credentials.ShardRunArguments, i, curProcessId, _port)
}); });
await Task.Delay(5000); await Task.Delay(5000);
} }

View File

@ -16,5 +16,7 @@
}, },
"TotalShards": 1, "TotalShards": 1,
"PatreonAccessToken": "", "PatreonAccessToken": "",
"ShardRunCommand": "" "ShardRunCommand": "",
"ShardRunArguments": "",
"ShardRunPort": null
} }