commit
a2e547104f
10 changed files with 159 additions and 13 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -351,3 +351,4 @@ MigrationBackup/
|
||||||
|
|
||||||
# Ionide (cross platform F# VS Code tools) working folder
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
.ionide/
|
.ionide/
|
||||||
|
/src/BSLManager/Properties/launchSettings.json
|
||||||
|
|
|
@ -8,10 +8,12 @@ EXPOSE 443
|
||||||
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
|
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
|
||||||
COPY ./src/ ./src/
|
COPY ./src/ ./src/
|
||||||
RUN dotnet restore "/src/BirdsiteLive/BirdsiteLive.csproj"
|
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
|
RUN dotnet build "/src/BirdsiteLive/BirdsiteLive.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
FROM build AS publish
|
FROM build AS publish
|
||||||
RUN dotnet publish "/src/BirdsiteLive/BirdsiteLive.csproj" -c Release -o /app/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
|
FROM base AS final
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
12
src/BSLManager/BSLManager.csproj
Normal file
12
src/BSLManager/BSLManager.csproj
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Terminal.Gui" Version="1.0.0-beta.11" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
119
src/BSLManager/Program.cs
Normal file
119
src/BSLManager/Program.cs
Normal file
|
@ -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<string>();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -46,7 +46,10 @@ namespace BirdsiteLive.Domain
|
||||||
httpClient.DefaultRequestHeaders.Add("Accept", "application/activity+json");
|
httpClient.DefaultRequestHeaders.Add("Accept", "application/activity+json");
|
||||||
var result = await httpClient.GetAsync(objectId);
|
var result = await httpClient.GetAsync(objectId);
|
||||||
var content = await result.Content.ReadAsStringAsync();
|
var content = await result.Content.ReadAsStringAsync();
|
||||||
return JsonConvert.DeserializeObject<Actor>(content);
|
|
||||||
|
var actor = JsonConvert.DeserializeObject<Actor>(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)
|
public async Task PostNewNoteActivity(Note note, string username, string noteId, string targetHost, string targetInbox)
|
||||||
|
|
|
@ -16,6 +16,7 @@ namespace BirdsiteLive.Pipeline.Tools
|
||||||
|
|
||||||
private int _totalUsersCount = -1;
|
private int _totalUsersCount = -1;
|
||||||
private int _warmUpIterations;
|
private int _warmUpIterations;
|
||||||
|
private const int WarmUpMaxCapacity = 200;
|
||||||
|
|
||||||
#region Ctor
|
#region Ctor
|
||||||
public MaxUsersNumberProvider(InstanceSettings instanceSettings, ITwitterUserDal twitterUserDal)
|
public MaxUsersNumberProvider(InstanceSettings instanceSettings, ITwitterUserDal twitterUserDal)
|
||||||
|
@ -31,8 +32,7 @@ namespace BirdsiteLive.Pipeline.Tools
|
||||||
if (_totalUsersCount == -1)
|
if (_totalUsersCount == -1)
|
||||||
{
|
{
|
||||||
_totalUsersCount = await _twitterUserDal.GetTwitterUsersCountAsync();
|
_totalUsersCount = await _twitterUserDal.GetTwitterUsersCountAsync();
|
||||||
var warmUpMaxCapacity = _instanceSettings.MaxUsersCapacity / 4;
|
_warmUpIterations = (int)(_totalUsersCount / (float)WarmUpMaxCapacity);
|
||||||
_warmUpIterations = warmUpMaxCapacity == 0 ? 0 : (int)(_totalUsersCount / (float)warmUpMaxCapacity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return if warm up ended
|
// Return if warm up ended
|
||||||
|
@ -40,7 +40,7 @@ namespace BirdsiteLive.Pipeline.Tools
|
||||||
|
|
||||||
// Calculate warm up value
|
// Calculate warm up value
|
||||||
var maxUsers = _warmUpIterations > 0
|
var maxUsers = _warmUpIterations > 0
|
||||||
? _instanceSettings.MaxUsersCapacity / 4
|
? WarmUpMaxCapacity
|
||||||
: _instanceSettings.MaxUsersCapacity;
|
: _instanceSettings.MaxUsersCapacity;
|
||||||
_warmUpIterations--;
|
_warmUpIterations--;
|
||||||
return maxUsers;
|
return maxUsers;
|
||||||
|
|
|
@ -43,10 +43,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.DAL.Tests", "T
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Moderation", "BirdsiteLive.Moderation\BirdsiteLive.Moderation.csproj", "{4BE541AC-8A93-4FA3-98AC-956CC2D5B748}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Moderation", "BirdsiteLive.Moderation\BirdsiteLive.Moderation.csproj", "{4BE541AC-8A93-4FA3-98AC-956CC2D5B748}"
|
||||||
EndProject
|
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
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Common.Tests", "Tests\BirdsiteLive.Common.Tests\BirdsiteLive.Common.Tests.csproj", "{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BirdsiteLive.Common.Tests", "Tests\BirdsiteLive.Common.Tests\BirdsiteLive.Common.Tests.csproj", "{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BSLManager", "BSLManager\BSLManager.csproj", "{4A84D351-E91B-4E58-8E20-211F0F4991D7}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
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}.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.ActiveCfg = Release|Any CPU
|
||||||
{C69F7582-6050-44DC-BAAB-7C8F0BDA525C}.Release|Any CPU.Build.0 = 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
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
<UserSecretsId>d21486de-a812-47eb-a419-05682bb68856</UserSecretsId>
|
<UserSecretsId>d21486de-a812-47eb-a419-05682bb68856</UserSecretsId>
|
||||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||||
<Version>0.16.1</Version>
|
<Version>0.16.2</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"AdminEmail": "me@domain.name",
|
"AdminEmail": "me@domain.name",
|
||||||
"ResolveMentionsInProfiles": true,
|
"ResolveMentionsInProfiles": true,
|
||||||
"PublishReplies": false,
|
"PublishReplies": false,
|
||||||
"MaxUsersCapacity": 800,
|
"MaxUsersCapacity": 1500,
|
||||||
"UnlistedTwitterAccounts": null
|
"UnlistedTwitterAccounts": null
|
||||||
},
|
},
|
||||||
"Db": {
|
"Db": {
|
||||||
|
|
|
@ -30,17 +30,20 @@ namespace BirdsiteLive.Pipeline.Tests.Tools
|
||||||
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);
|
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);
|
||||||
|
|
||||||
var result = await provider.GetMaxUsersNumberAsync();
|
var result = await provider.GetMaxUsersNumberAsync();
|
||||||
Assert.AreEqual(250, result);
|
Assert.AreEqual(200, result);
|
||||||
|
|
||||||
result = await provider.GetMaxUsersNumberAsync();
|
result = await provider.GetMaxUsersNumberAsync();
|
||||||
Assert.AreEqual(250, result);
|
Assert.AreEqual(200, result);
|
||||||
|
|
||||||
result = await provider.GetMaxUsersNumberAsync();
|
result = await provider.GetMaxUsersNumberAsync();
|
||||||
Assert.AreEqual(250, result);
|
Assert.AreEqual(200, result);
|
||||||
|
|
||||||
result = await provider.GetMaxUsersNumberAsync();
|
result = await provider.GetMaxUsersNumberAsync();
|
||||||
Assert.AreEqual(250, result);
|
Assert.AreEqual(200, result);
|
||||||
|
|
||||||
|
result = await provider.GetMaxUsersNumberAsync();
|
||||||
|
Assert.AreEqual(200, result);
|
||||||
|
|
||||||
result = await provider.GetMaxUsersNumberAsync();
|
result = await provider.GetMaxUsersNumberAsync();
|
||||||
Assert.AreEqual(1000, result);
|
Assert.AreEqual(1000, result);
|
||||||
|
|
||||||
|
@ -63,7 +66,7 @@ namespace BirdsiteLive.Pipeline.Tests.Tools
|
||||||
var twitterUserDalMock = new Mock<ITwitterUserDal>(MockBehavior.Strict);
|
var twitterUserDalMock = new Mock<ITwitterUserDal>(MockBehavior.Strict);
|
||||||
twitterUserDalMock
|
twitterUserDalMock
|
||||||
.Setup(x => x.GetTwitterUsersCountAsync())
|
.Setup(x => x.GetTwitterUsersCountAsync())
|
||||||
.ReturnsAsync(249);
|
.ReturnsAsync(199);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);
|
var provider = new MaxUsersNumberProvider(settings, twitterUserDalMock.Object);
|
||||||
|
|
Loading…
Add table
Reference in a new issue