From 898ff85eed2670a875d824e160b2324b7eff9b25 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Fri, 7 Feb 2025 16:54:42 +0700 Subject: [PATCH] Fix bot things --- .../Controllers/DataController.cs | 6 +- .../Abstractions/IBotService.cs | 1 + .../ManageBot/BotService.cs | 11 ++++ .../ToggleIsForWatchingCommandHandler.cs | 16 ++--- src/Managing.Domain/Bots/Bot.cs | 41 +++++++----- src/Managing.WebApp/src/hooks/useAccounts.tsx | 9 +-- .../src/pages/botsPage/botList.tsx | 23 ++----- .../src/pages/botsPage/bots.tsx | 65 +++++++++---------- 8 files changed, 86 insertions(+), 86 deletions(-) diff --git a/src/Managing.Api/Controllers/DataController.cs b/src/Managing.Api/Controllers/DataController.cs index 5b285a5..84a57ff 100644 --- a/src/Managing.Api/Controllers/DataController.cs +++ b/src/Managing.Api/Controllers/DataController.cs @@ -73,11 +73,11 @@ public class DataController : ControllerBase public ActionResult GetSpotlight() { var overview = _cacheService.GetOrSave(nameof(SpotlightOverview), - () => { return _statisticService.GetLastSpotlight(DateTime.Now.AddHours(-3)); }, TimeSpan.FromMinutes(2)); + () => { return _statisticService.GetLastSpotlight(DateTime.Now.AddDays(-2)); }, TimeSpan.FromMinutes(2)); - if (overview?.Spotlights.Count < overview?.ScenarioCount) + if (overview?.Spotlights.Count < overview?.ScenarioCount || overview == null) { - overview = _statisticService.GetLastSpotlight(DateTime.Now.AddHours(-3)); + overview = _statisticService.GetLastSpotlight(DateTime.Now.AddDays(-2)); } return Ok(overview); diff --git a/src/Managing.Application/Abstractions/IBotService.cs b/src/Managing.Application/Abstractions/IBotService.cs index 77b7d46..df73692 100644 --- a/src/Managing.Application/Abstractions/IBotService.cs +++ b/src/Managing.Application/Abstractions/IBotService.cs @@ -32,4 +32,5 @@ public interface IBotService Task DeleteBot(string requestName); Task RestartBot(string requestName); void DeleteBotBackup(string backupBotName); + void ToggleIsForWatchingOnly(string botName); } \ No newline at end of file diff --git a/src/Managing.Application/ManageBot/BotService.cs b/src/Managing.Application/ManageBot/BotService.cs index ae977d3..126d166 100644 --- a/src/Managing.Application/ManageBot/BotService.cs +++ b/src/Managing.Application/ManageBot/BotService.cs @@ -210,6 +210,17 @@ namespace Managing.Application.ManageBot _botRepository.DeleteBotBackup(backupBotName); } + public void ToggleIsForWatchingOnly(string botName) + { + if (_botTasks.TryGetValue(botName, out var botWrapper)) + { + if (botWrapper.BotInstance is ITradingBot bot) + { + bot.IsForWatchingOnly = !bot.IsForWatchingOnly; + } + } + } + public ITradingBot CreateScalpingBot(string accountName, MoneyManagement moneyManagement, string name, Enums.Ticker ticker, string scenario, Enums.Timeframe interval, bool isForWatchingOnly) { diff --git a/src/Managing.Application/ManageBot/ToggleIsForWatchingCommandHandler.cs b/src/Managing.Application/ManageBot/ToggleIsForWatchingCommandHandler.cs index d8ae52e..a213c18 100644 --- a/src/Managing.Application/ManageBot/ToggleIsForWatchingCommandHandler.cs +++ b/src/Managing.Application/ManageBot/ToggleIsForWatchingCommandHandler.cs @@ -6,18 +6,18 @@ namespace Managing.Application.ManageBot { public class ToggleIsForWatchingCommandHandler : IRequestHandler { - private readonly ITaskCache _taskCache; + private readonly IBotService _botService; - public ToggleIsForWatchingCommandHandler(ITaskCache taskCache) + public ToggleIsForWatchingCommandHandler(IBotService botService) { - _taskCache = taskCache; + _botService = botService; } - public async Task Handle(ToggleIsForWatchingCommand request, CancellationToken cancellationToken) + public Task Handle(ToggleIsForWatchingCommand request, CancellationToken cancellationToken) { - var bot = _taskCache.Get(request.Name); - await bot.ToggleIsForWatchOnly(); - return bot.GetStatus(); + _botService.ToggleIsForWatchingOnly(request.Name); + var bot = _botService.GetActiveBots().FirstOrDefault(b => b.Name == request.Name); + return Task.FromResult(bot?.IsForWatchingOnly.ToString()); } } -} +} \ No newline at end of file diff --git a/src/Managing.Domain/Bots/Bot.cs b/src/Managing.Domain/Bots/Bot.cs index b42b398..e86f8ef 100644 --- a/src/Managing.Domain/Bots/Bot.cs +++ b/src/Managing.Domain/Bots/Bot.cs @@ -31,25 +31,36 @@ namespace Managing.Domain.Bots public async Task InitWorker(Func action) { - await Task.Run(async () => + try { - while (Status == BotStatus.Up) + await Task.Run(async () => { - try + while (Status == BotStatus.Up && !CancellationToken.IsCancellationRequested) { - await action(); + try + { + await action(); + ExecutionCount++; + await Task.Delay(Interval, CancellationToken.Token); + if (CancellationToken.IsCancellationRequested) + break; + } + catch (TaskCanceledException) when (CancellationToken.IsCancellationRequested) + { + // Graceful shutdown when cancellation is requested + break; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - - ExecutionCount++; - await Task.Delay(Interval, CancellationToken.Token); - if (CancellationToken.IsCancellationRequested) - break; - } - }, CancellationToken.Token); + }, CancellationToken.Token); + } + catch (TaskCanceledException) + { + Console.WriteLine(); + } } public void Stop() diff --git a/src/Managing.WebApp/src/hooks/useAccounts.tsx b/src/Managing.WebApp/src/hooks/useAccounts.tsx index e061f7e..2e9b67e 100644 --- a/src/Managing.WebApp/src/hooks/useAccounts.tsx +++ b/src/Managing.WebApp/src/hooks/useAccounts.tsx @@ -7,16 +7,11 @@ type UseAccountsProps = { callback?: (data: Account[]) => void | undefined } -const useAcconuts = ({ callback }: UseAccountsProps) => { +const useAccounts = ({ }: UseAccountsProps) => { const { apiUrl } = useApiUrlStore() const accountClient = new AccountClient({}, apiUrl) const query = useQuery({ - onSuccess: (data) => { - if (data && callback) { - callback(data) - } - }, queryFn: () => accountClient.account_GetAccounts(), queryKey: ['accounts'], }) @@ -24,4 +19,4 @@ const useAcconuts = ({ callback }: UseAccountsProps) => { return query } -export default useAcconuts +export default useAccounts diff --git a/src/Managing.WebApp/src/pages/botsPage/botList.tsx b/src/Managing.WebApp/src/pages/botsPage/botList.tsx index ef64e83..99eea1b 100644 --- a/src/Managing.WebApp/src/pages/botsPage/botList.tsx +++ b/src/Managing.WebApp/src/pages/botsPage/botList.tsx @@ -104,7 +104,7 @@ const BotList: React.FC = ({ list }) => { } function getMoneyManagementBadge(moneyManagement: MoneyManagement) { - const classes = baseBadgeClass() + 'bg-primary' + const classes = baseBadgeClass() + ' bg-primary' return ( ) @@ -180,26 +180,13 @@ const BotList: React.FC = ({ list }) => {

- {bot.name} - {/* {exchangeBadge(bot.exchange)} */} + {bot.ticker} + {getMoneyManagementBadge(bot.moneyManagement)} {getIsForWatchingBadge(bot.isForWatchingOnly, bot.name)} {getToggleBotStatusBadge(bot.status, bot.name, bot.botType)} {getDeleteBadge(bot.name)} - {getMoneyManagementBadge(bot.moneyManagement)}

-
-
-
- -
-
- -
-
-
+
diff --git a/src/Managing.WebApp/src/pages/botsPage/bots.tsx b/src/Managing.WebApp/src/pages/botsPage/bots.tsx index 395eef8..7e1edbb 100644 --- a/src/Managing.WebApp/src/pages/botsPage/bots.tsx +++ b/src/Managing.WebApp/src/pages/botsPage/bots.tsx @@ -23,11 +23,9 @@ import { } from '../../generated/ManagingApi' import BotList from './botList' +import { useQuery } from '@tanstack/react-query' const Bots: React.FC = () => { - const [bots, setBots] = useState([]) - const [scenarios, setScenarios] = React.useState([]) - const [accounts, setAccounts] = React.useState([]) const [showModal, setShowModal] = useState(false) const { register, handleSubmit } = useForm() const { apiUrl } = useApiUrlStore() @@ -46,42 +44,39 @@ const Bots: React.FC = () => { }) } - useEffect(() => { - setupHubConnection().then(() => { - if (bots.length == 0) { - botClient.bot_GetActiveBots().then((data) => { - setBots(data) - }) - } - }) + const { data: bots } = useQuery({ + queryFn: () => botClient.bot_GetActiveBots(), + queryKey: ['bots'], + }) - const scenarioClient = new ScenarioClient({}, apiUrl) - scenarioClient.scenario_GetScenarios().then((data) => { - setScenarios(data) - }) + const scenarioClient = new ScenarioClient({}, apiUrl) + const { data: scenarios } = useQuery({ + queryFn: () => scenarioClient.scenario_GetScenarios(), + queryKey: ['scenarios'], + }) - const accountClient = new AccountClient({}, apiUrl) - accountClient.account_GetAccounts().then((data) => { - setAccounts(data) - }) - }, []) + const accountClient = new AccountClient({}, apiUrl) + const { data: accounts } = useQuery({ + queryFn: () => accountClient.account_GetAccounts(), + queryKey: ['accounts'], + }) - const setupHubConnection = async () => { - const hub = new Hub('bothub', apiUrl).hub + // const setupHubConnection = async () => { + // const hub = new Hub('bothub', apiUrl).hub - hub.on('BotsSubscription', (bots: TradingBot[]) => { - // eslint-disable-next-line no-console - console.log( - 'bot List', - bots.map((bot) => { - return bot.name - }) - ) - setBots(bots) - }) + // hub.on('BotsSubscription', (bots: TradingBot[]) => { + // // eslint-disable-next-line no-console + // console.log( + // 'bot List', + // bots.map((bot) => { + // return bot.name + // }) + // ) + // setBots(bots) + // }) - return hub - } + // return hub + // } function openModal() { setShowModal(true) @@ -136,7 +131,7 @@ const Bots: React.FC = () => {
- + {showModal ? ( <>