diff --git a/.gitignore b/.gitignore
index 086c047..a6584fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -351,3 +351,4 @@ MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
+/src/BSLManager/Properties/launchSettings.json
diff --git a/Dockerfile b/Dockerfile
index 0dcccda..7239ca2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,10 +8,12 @@ EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
COPY ./src/ ./src/
RUN dotnet restore "/src/BirdsiteLive/BirdsiteLive.csproj"
+RUN dotnet restore "/src/BSLManager/BSLManager.csproj"
RUN dotnet build "/src/BirdsiteLive/BirdsiteLive.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "/src/BirdsiteLive/BirdsiteLive.csproj" -c Release -o /app/publish
+RUN dotnet publish "/src/BSLManager/BSLManager.csproj" -r linux-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeAllContentForSelfExtract=true -c Release -o /app/publish
FROM base AS final
WORKDIR /app
diff --git a/src/BSLManager/BSLManager.csproj b/src/BSLManager/BSLManager.csproj
new file mode 100644
index 0000000..fafc29d
--- /dev/null
+++ b/src/BSLManager/BSLManager.csproj
@@ -0,0 +1,12 @@
+
+
+
+ Exe
+ netcoreapp3.1
+
+
+
+
+
+
+
diff --git a/src/BSLManager/Program.cs b/src/BSLManager/Program.cs
new file mode 100644
index 0000000..ff1a8bd
--- /dev/null
+++ b/src/BSLManager/Program.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using NStack;
+using Terminal.Gui;
+
+namespace BSLManager
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.OutputEncoding = Encoding.Default;
+
+ Application.Init();
+ var top = Application.Top;
+
+ // Creates the top-level window to show
+ var win = new Window("BSL Manager")
+ {
+ X = 0,
+ Y = 1, // Leave one row for the toplevel menu
+
+ // By using Dim.Fill(), it will automatically resize without manual intervention
+ Width = Dim.Fill(),
+ Height = Dim.Fill()
+ };
+
+ top.Add(win);
+
+ // Creates a menubar, the item "New" has a help menu.
+ var menu = new MenuBar(new MenuBarItem[] {
+ new MenuBarItem ("_File", new MenuItem [] {
+ new MenuItem ("_Quit", "", () => { if (Quit ()) top.Running = false; })
+ }),
+ //new MenuBarItem ("_Edit", new MenuItem [] {
+ // new MenuItem ("_Copy", "", null),
+ // new MenuItem ("C_ut", "", null),
+ // new MenuItem ("_Paste", "", null)
+ //})
+ });
+ top.Add(menu);
+
+ static bool Quit()
+ {
+ var n = MessageBox.Query(50, 7, "Quit BSL Manager", "Are you sure you want to quit?", "Yes", "No");
+ return n == 0;
+ }
+
+ var listData = new List();
+ for (var i = 0; i < 100; i++)
+ {
+ listData.Add($"@User{i}@Instance.tld {i*3}");
+ }
+
+ var list = new ListView(listData)
+ {
+ X = 1,
+ Y = 2,
+ Width = Dim.Fill(),
+ Height = Dim.Fill()
+ };
+
+ list.KeyDown += _ =>
+ {
+ if (_.KeyEvent.Key == Key.Enter)
+ {
+ var el = list.SelectedItem;
+
+ bool okpressed = false;
+ var ok = new Button(10, 14, "Yes");
+ ok.Clicked += () =>
+ {
+ Application.RequestStop();
+ okpressed = true;
+ };
+
+ var cancel = new Button(3, 14, "No");
+ cancel.Clicked += () => Application.RequestStop();
+
+ var dialog = new Dialog("Delete", 60, 18, cancel, ok);
+
+ var name = new Label($"User: {listData[el]}")
+ {
+ X = 1,
+ Y = 1,
+ Width = Dim.Fill(),
+ Height = 1
+ };
+ var entry = new Label("Delete user and remove all their followings?")
+ {
+ X = 1,
+ Y = 3,
+ Width = Dim.Fill(),
+ Height = 1
+ };
+ dialog.Add(name);
+ dialog.Add(entry);
+ Application.Run(dialog);
+
+ if (okpressed)
+ {
+ listData.RemoveAt(el);
+ typeof(Application).GetMethod("TerminalResized", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
+ }
+ }
+ };
+
+ // Add some controls,
+ win.Add(
+ new Label(1, 0, "Listing followers"),
+ list
+ );
+
+ Application.Run();
+ }
+ }
+}
diff --git a/src/BirdsiteLive.Domain/ActivityPubService.cs b/src/BirdsiteLive.Domain/ActivityPubService.cs
index fa3bf70..37fe0b5 100644
--- a/src/BirdsiteLive.Domain/ActivityPubService.cs
+++ b/src/BirdsiteLive.Domain/ActivityPubService.cs
@@ -46,7 +46,10 @@ namespace BirdsiteLive.Domain
httpClient.DefaultRequestHeaders.Add("Accept", "application/activity+json");
var result = await httpClient.GetAsync(objectId);
var content = await result.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(content);
+
+ var actor = JsonConvert.DeserializeObject(content);
+ if (string.IsNullOrWhiteSpace(actor.url)) actor.url = objectId;
+ return actor;
}
public async Task PostNewNoteActivity(Note note, string username, string noteId, string targetHost, string targetInbox)
diff --git a/src/BirdsiteLive.Pipeline/Tools/MaxUsersNumberProvider.cs b/src/BirdsiteLive.Pipeline/Tools/MaxUsersNumberProvider.cs
index c84b7b1..1c7e7c4 100644
--- a/src/BirdsiteLive.Pipeline/Tools/MaxUsersNumberProvider.cs
+++ b/src/BirdsiteLive.Pipeline/Tools/MaxUsersNumberProvider.cs
@@ -16,6 +16,7 @@ namespace BirdsiteLive.Pipeline.Tools
private int _totalUsersCount = -1;
private int _warmUpIterations;
+ private const int WarmUpMaxCapacity = 200;
#region Ctor
public MaxUsersNumberProvider(InstanceSettings instanceSettings, ITwitterUserDal twitterUserDal)
@@ -31,8 +32,7 @@ namespace BirdsiteLive.Pipeline.Tools
if (_totalUsersCount == -1)
{
_totalUsersCount = await _twitterUserDal.GetTwitterUsersCountAsync();
- var warmUpMaxCapacity = _instanceSettings.MaxUsersCapacity / 4;
- _warmUpIterations = warmUpMaxCapacity == 0 ? 0 : (int)(_totalUsersCount / (float)warmUpMaxCapacity);
+ _warmUpIterations = (int)(_totalUsersCount / (float)WarmUpMaxCapacity);
}
// Return if warm up ended
@@ -40,7 +40,7 @@ namespace BirdsiteLive.Pipeline.Tools
// Calculate warm up value
var maxUsers = _warmUpIterations > 0
- ? _instanceSettings.MaxUsersCapacity / 4
+ ? WarmUpMaxCapacity
: _instanceSettings.MaxUsersCapacity;
_warmUpIterations--;
return maxUsers;
diff --git a/src/BirdsiteLive.sln b/src/BirdsiteLive.sln
index 737b8b1..ba118c6 100644
--- a/src/BirdsiteLive.sln
+++ b/src/BirdsiteLive.sln
@@ -43,10 +43,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.DAL.Tests", "T
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Moderation", "BirdsiteLive.Moderation\BirdsiteLive.Moderation.csproj", "{4BE541AC-8A93-4FA3-98AC-956CC2D5B748}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BirdsiteLive.Moderation.Tests", "Tests\BirdsiteLive.Moderation.Tests\BirdsiteLive.Moderation.Tests.csproj", "{0A311BF3-4FD9-4303-940A-A3778890561C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Moderation.Tests", "Tests\BirdsiteLive.Moderation.Tests\BirdsiteLive.Moderation.Tests.csproj", "{0A311BF3-4FD9-4303-940A-A3778890561C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Common.Tests", "Tests\BirdsiteLive.Common.Tests\BirdsiteLive.Common.Tests.csproj", "{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BSLManager", "BSLManager\BSLManager.csproj", "{4A84D351-E91B-4E58-8E20-211F0F4991D7}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -125,6 +127,10 @@ Global
{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A84D351-E91B-4E58-8E20-211F0F4991D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4A84D351-E91B-4E58-8E20-211F0F4991D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4A84D351-E91B-4E58-8E20-211F0F4991D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4A84D351-E91B-4E58-8E20-211F0F4991D7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/BirdsiteLive/BirdsiteLive.csproj b/src/BirdsiteLive/BirdsiteLive.csproj
index 9daebca..dd17829 100644
--- a/src/BirdsiteLive/BirdsiteLive.csproj
+++ b/src/BirdsiteLive/BirdsiteLive.csproj
@@ -4,7 +4,7 @@
netcoreapp3.1
d21486de-a812-47eb-a419-05682bb68856
Linux
- 0.16.1
+ 0.16.2
diff --git a/src/BirdsiteLive/appsettings.json b/src/BirdsiteLive/appsettings.json
index e25c7ca..8b12018 100644
--- a/src/BirdsiteLive/appsettings.json
+++ b/src/BirdsiteLive/appsettings.json
@@ -20,7 +20,7 @@
"AdminEmail": "me@domain.name",
"ResolveMentionsInProfiles": true,
"PublishReplies": false,
- "MaxUsersCapacity": 800,
+ "MaxUsersCapacity": 1500,
"UnlistedTwitterAccounts": null
},
"Db": {
diff --git a/src/Tests/BirdsiteLive.Pipeline.Tests/Tools/MaxUsersNumberProviderTests.cs b/src/Tests/BirdsiteLive.Pipeline.Tests/Tools/MaxUsersNumberProviderTests.cs
index d48beb8..c2f52d0 100644
--- a/src/Tests/BirdsiteLive.Pipeline.Tests/Tools/MaxUsersNumberProviderTests.cs
+++ b/src/Tests/BirdsiteLive.Pipeline.Tests/Tools/MaxUsersNumberProviderTests.cs
@@ -30,17 +30,20 @@ namespace BirdsiteLive.Pipeline.Tests.Tools
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);
var result = await provider.GetMaxUsersNumberAsync();
- Assert.AreEqual(250, result);
+ Assert.AreEqual(200, result);
result = await provider.GetMaxUsersNumberAsync();
- Assert.AreEqual(250, result);
+ Assert.AreEqual(200, result);
result = await provider.GetMaxUsersNumberAsync();
- Assert.AreEqual(250, result);
+ Assert.AreEqual(200, result);
result = await provider.GetMaxUsersNumberAsync();
- Assert.AreEqual(250, result);
-
+ Assert.AreEqual(200, result);
+
+ result = await provider.GetMaxUsersNumberAsync();
+ Assert.AreEqual(200, result);
+
result = await provider.GetMaxUsersNumberAsync();
Assert.AreEqual(1000, result);
@@ -63,7 +66,7 @@ namespace BirdsiteLive.Pipeline.Tests.Tools
var twitterUserDalMock = new Mock(MockBehavior.Strict);
twitterUserDalMock
.Setup(x => x.GetTwitterUsersCountAsync())
- .ReturnsAsync(249);
+ .ReturnsAsync(199);
#endregion
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);