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:
parent
902ddc70f6
commit
ee8643bf29
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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";
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -16,5 +16,7 @@
|
|||||||
},
|
},
|
||||||
"TotalShards": 1,
|
"TotalShards": 1,
|
||||||
"PatreonAccessToken": "",
|
"PatreonAccessToken": "",
|
||||||
"ShardRunCommand": ""
|
"ShardRunCommand": "",
|
||||||
|
"ShardRunArguments": "",
|
||||||
|
"ShardRunPort": null
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user