Files

1 line
122 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "btunctr/valsharp", "files": {"App/MiddlewareContainer.cs": {"9f5ab127964da24fed77dc3fe836249af30433ce": {"t": 1785745797.133754, "n": 2282, "h": "669d0e616f77d4e0", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing ValSharp.Core;\n\nnamespace ValSharp_Demo\n{\n internal class MiddlewareContainer\n {\n public static Dictionary<string, string> LastPlayerMessages = new();\n public static string? LastMessagePlayerPUUID = null;\n public static bool IsAIResponseEnabled = false;\n\n private readonly ValClient valClient;\n private readonly ILogger<MiddlewareContainer> logger;\n private readonly DeepSeekClient deepSeekClient = new DeepSeekClient(AIConstants.DEEPSEEK_API_KEY);\n\n public MiddlewareContainer(ValClient client, ILoggerFactory loggerFactory)\n {\n valClient = client;\n logger = loggerFactory.CreateLogger<MiddlewareContainer>();\n\n valClient.GameStateChanged += (@new, @old) =>\n {\n LastPlayerMessages.Clear();\n };\n }\n\n [Incoming]\n public MiddlewareAction LastPlayerMessageMiddleware(InGameMessage message)\n {\n if (message.Body.StartsWith(\"!\"))\n return MiddlewareAction.Continue;\n\n LastPlayerMessages[message.FromSubject] = message.Body;\n LastMessagePlayerPUUID = message.FromSubject;\n\n return MiddlewareAction.Continue;\n }\n\n [Outgoing]\n public async Task<MiddlewareAction> AIResponseMiddleware(InGameMessage message)\n {\n if (!IsAIResponseEnabled || message.Body.StartsWith(\"!\"))\n return MiddlewareAction.Continue;\n\n var chatRequest = AIConstants.OSMANLI();\n chatRequest.Messages.Add(Message.NewUserMessage(message.Body));\n\n var chatResponse = await deepSeekClient.ChatAsync(chatRequest, CancellationToken.None);\n string? textResponse = chatResponse?.Choices?.FirstOrDefault()?.Message?.Content;\n\n if (string.IsNullOrEmpty(textResponse))\n {\n message.Drop();\n return MiddlewareAction.Cancel;\n }\n\n message.Modify(textResponse!);\n logger.LogDebug(\"AI Response: \" + textResponse!);\n\n return MiddlewareAction.Cancel;\n }\n }\n}\n"}, "e22cfd10112fc3aecb63f6db22b38d24ae2e10fd": {"t": 1785756591.532039, "n": 2282, "h": "669d0e616f77d4e0", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing ValSharp.Core;\n\nnamespace ValSharp_Demo\n{\n internal class MiddlewareContainer\n {\n public static Dictionary<string, string> LastPlayerMessages = new();\n public static string? LastMessagePlayerPUUID = null;\n public static bool IsAIResponseEnabled = false;\n\n private readonly ValClient valClient;\n private readonly ILogger<MiddlewareContainer> logger;\n private readonly DeepSeekClient deepSeekClient = new DeepSeekClient(AIConstants.DEEPSEEK_API_KEY);\n\n public MiddlewareContainer(ValClient client, ILoggerFactory loggerFactory)\n {\n valClient = client;\n logger = loggerFactory.CreateLogger<MiddlewareContainer>();\n\n valClient.GameStateChanged += (@new, @old) =>\n {\n LastPlayerMessages.Clear();\n };\n }\n\n [Incoming]\n public MiddlewareAction LastPlayerMessageMiddleware(InGameMessage message)\n {\n if (message.Body.StartsWith(\"!\"))\n return MiddlewareAction.Continue;\n\n LastPlayerMessages[message.FromSubject] = message.Body;\n LastMessagePlayerPUUID = message.FromSubject;\n\n return MiddlewareAction.Continue;\n }\n\n [Outgoing]\n public async Task<MiddlewareAction> AIResponseMiddleware(InGameMessage message)\n {\n if (!IsAIResponseEnabled || message.Body.StartsWith(\"!\"))\n return MiddlewareAction.Continue;\n\n var chatRequest = AIConstants.OSMANLI();\n chatRequest.Messages.Add(Message.NewUserMessage(message.Body));\n\n var chatResponse = await deepSeekClient.ChatAsync(chatRequest, CancellationToken.None);\n string? textResponse = chatResponse?.Choices?.FirstOrDefault()?.Message?.Content;\n\n if (string.IsNullOrEmpty(textResponse))\n {\n message.Drop();\n return MiddlewareAction.Cancel;\n }\n\n message.Modify(textResponse!);\n logger.LogDebug(\"AI Response: \" + textResponse!);\n\n return MiddlewareAction.Cancel;\n }\n }\n}\n"}}, "App/CommandContainer.cs": {"9f5ab127964da24fed77dc3fe836249af30433ce": {"t": 1785745808.360837, "n": 22904, "h": "84370a0d7e9f8f97", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.RegularExpressions;\nusing ValSharp.Content;\nusing ValSharp.Core;\nusing ValSharp.Interceptors;\nusing YamlDotNet.Core.Tokens;\n\nnamespace ValSharp_Demo\n{\n internal class CommandContainer\n {\n private readonly ValClient valClient;\n private readonly ILogger<CommandContainer> logger;\n private readonly DeepSeekClient deepSeekClient = new DeepSeekClient(AIConstants.DEEPSEEK_API_KEY);\n private readonly HashSet<string> commandAskWhitelist = new();\n private CancellationTokenSource? cmdAskCts;\n \n public CommandContainer(ValClient client, ILoggerFactory loggerFactory)\n {\n valClient = client;\n logger = loggerFactory.CreateLogger<CommandContainer>();\n }\n\n [Command(\"ai\")]\n [Outgoing]\n public async Task CmdAISwitch(InGameMessage message)\n {\n MiddlewareContainer.IsAIResponseEnabled = !MiddlewareContainer.IsAIResponseEnabled;\n string msg = $\"AI {(MiddlewareContainer.IsAIResponseEnabled ? \"Enabled\" : \"Disabled\")}\";\n\n message.Drop();\n message.ReplySilently(msg);\n logger?.LogInformation(msg);\n }\n\n [Command(\"r\")]\n [Outgoing]\n public async Task CmdAIReply(InGameMessage message, string[] args)\n {\n message.Drop();\n\n string? puuid = MiddlewareContainer.LastMessagePlayerPUUID;\n\n if (args.Length >= 1)\n {\n if (!InGameCache.Instance.TryFindPlayer(args[0], out puuid, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n }\n\n if (puuid is null || !MiddlewareContainer.LastPlayerMessages.TryGetValue(puuid, out string? lastMessage))\n return;\n\n var chatRequest = AIConstants.YAPISTIR();\n chatRequest.Messages.Add(Message.NewUserMessage(lastMessage!));\n\n var chatResponse = await deepSeekClient.ChatAsync(chatRequest, new CancellationToken());\n string? textResponse = chatResponse?.Choices?.FirstOrDefault()?.Message?.Content;\n\n if (string.IsNullOrEmpty(textResponse))\n return;\n\n message.Undrop();\n message.Modify(textResponse!);\n logger.LogDebug(\"AI Response: \" + textResponse!);\n }\n\n [Command(\"kimin\")]\n public async Task CmdWhose(InGameMessage message, string[] args)\n {\n (Weapon? weapon, Skin? skin) ResolveWeaponAndSkin(string arg1, string arg2)\n {\n var weaponA = InGameCache.Instance.FindWeapon(arg1);\n var skinA = weaponA != null ? InGameCache.Instance.FindSkin(weaponA, arg2) : null;\n\n if (weaponA != null && skinA != null) return (weaponA, skinA);\n\n var weaponB = InGameCache.Instance.FindWeapon(arg2);\n var skinB = weaponB != null ? InGameCache.Instance.FindSkin(weaponB, arg1) : null;\n\n if (weaponB != null && skinB != null) return (weaponB, skinB);\n\n return weaponA != null ? (weaponA, skinA) : (weaponB, skinB);\n }\n\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string arg1 = args[0];\n string arg2 = args[1];\n\n if (arg1.Length < 2 || arg2.Length < 2)\n {\n message.Reply(\"Hatalı kullanım!\");\n return;\n }\n\n var (weapon, skin) = ResolveWeaponAndSkin(arg1, arg2);\n\n if (weapon == null || skin == null)\n {\n message.Reply(\"Bulunamadı :(\");\n return;\n }\n\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n var matchingLoadouts = InGameCache.Instance.MatchLoadouts!\n .Where(ml => ml.Items.TryGetValue(weapon.Uuid, out var item) &&\n item.Sockets[skinSocketId].Item.ID == skin.Uuid)\n .ToList();\n\n if (!matchingLoadouts.Any())\n {\n message.Reply($\"{skin.DisplayName} {weapon.DisplayName} kimsede yok.\");\n return;\n }\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = matchingLoadouts.Select(loadout =>\n {\n var owner = InGameCache.Instance.Match!.Players[loadout.Subject];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"s\")]\n public async Task CmdSkin(InGameMessage message, string[] args)\n {\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n string weaponQuery = args[1];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var weapon = InGameCache.Instance.FindWeapon(weaponQuery);\n if (weapon == null)\n {\n message.Reply(\"Silah bulunamadı!\");\n return;\n }\n\n var playerLoadout = InGameCache.Instance.MatchLoadouts!.FirstOrDefault(ml => ml.Subject == targetSubject);\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n\n if (playerLoadout != null && playerLoadout.Items.TryGetValue(weapon.Uuid, out var weaponItem))\n {\n var skinUuid = weaponItem.Sockets[skinSocketId].Item.ID;\n var skin = weapon.Skins.FirstOrDefault(s => s.Uuid == skinUuid);\n\n string response = skin != null ? skin.DisplayName : \"Standart\";\n message.Reply(response);\n }\n else\n {\n message.Reply(\"Silah verisi bulunamadı!\");\n }\n }\n\n [Command(\"rank\")]\n public async Task CmdRank(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents) || targetSubject is null)\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var activeSeason = InGameCache.Instance.Seasons!.FirstOrDefault(s => s.IsActive);\n var targetPlayer = InGameCache.Instance.Match!.Players[targetSubject!];\n var rankDetails = InGameCache.Instance.GetPlayerRankDetails(targetSubject!, activeSeason!.ID);\n\n if (rankDetails is null)\n {\n message.Reply(\"Oyuncunun rank detayları alınamadı!\");\n return;\n }\n\n string currentRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Current].TierName;\n string peakRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Peak].TierName;\n string avgRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Avg].TierName;\n\n message.Reply($\"{(!targetPlayer.PlayerIdentity.HideAccountLevel ? $\"Seviye: {targetPlayer.PlayerIdentity.AccountLevel}, \" : string.Empty)}Mevcut: {currentRankName}, Ortalama: {avgRankName}, Max: {peakRankName}\");\n }\n\n [Command(\"party\")]\n public async Task CmdParty(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMsg = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMsg);\n return;\n }\n\n string? commonPartyId = InGameCache.Instance!.PlayerPartyLookup?.FirstOrDefault(x => x.Contains(targetSubject!))?.Key;\n\n if (commonPartyId is null)\n {\n message.Reply(\"Grup bilgisi alınamadı!\");\n return;\n }\n\n var puuidCollection = InGameCache.Instance!.PlayerPartyLookup![commonPartyId!];\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = puuidCollection.Select(puuid =>\n {\n var owner = InGameCache.Instance.Match!.Players[puuid];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"sor\")]\n public async Task CmdAsk(InGameMessage message, string[] args)\n {\n if (args.Length == 0 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded || valClient.GameState != GameState.InGame)\n return;\n\n if (message.FromSubject != valClient.Auth.Subject && !commandAskWhitelist.Contains(message.FromSubject))\n {\n message.Reply(\"Bu komutu kullanma yetkiniz yok!\");\n return;\n }\n\n string question = string.Join(' ', args);\n if (question.Length > 400) return;\n\n cmdAskCts?.Dispose();\n cmdAskCts = new CancellationTokenSource();\n cmdAskCts.CancelAfter(TimeSpan.FromSeconds(45));\n\n int totalPromptTokens = 0;\n int totalCompletionTokens = 0;\n int currentTurn = 0;\n var calledFunctions = new List<string>();\n var sw = Stopwatch.StartNew();\n\n try\n {\n var fnContainer = new AIFunctions(valClient, message.FromSubject);\n var toolMethodMap = typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance)\n .ToDictionary(m => m.Name);\n\n var chatRequest = AIConstants.SOR();\n chatRequest.Messages.Add(Message.NewSystemMessage(\"Crnt Game Details;\\n\" + fnContainer.CurrentGame()));\n chatRequest.Messages.Add(Message.NewUserMessage(question));\n\n bool requiresAction = true;\n bool hasReplied = false;\n const int maxTurns = 3;\n\n while (requiresAction && currentTurn < maxTurns)\n {\n cmdAskCts.Token.ThrowIfCancellationRequested();\n\n var response = await deepSeekClient.ChatAsync(chatRequest, cmdAskCts.Token);\n if (response?.Choices == null || response.Choices.Count == 0) break;\n\n if (response.Usage != null)\n {\n totalPromptTokens += response.Usage.PromptTokens;\n totalCompletionTokens += response.Usage.CompletionTokens;\n }\n\n var aiMessage = response.Choices[0].Message;\n if (aiMessage is null) break;\n\n chatRequest.Messages.Add(aiMessage);\n\n if (aiMessage.ToolCalls != null && aiMessage.ToolCalls.Count > 0)\n {\n currentTurn++;\n\n foreach (var toolCalled in aiMessage.ToolCalls)\n {\n if (toolCalled?.Function == null) continue;\n calledFunctions.Add(toolCalled.Function.Name);\n\n if (!toolMethodMap.TryGetValue(toolCalled.Function.Name, out MethodInfo? method)) continue;\n\n var parameters = method.GetParameters();\n object? arg1 = null;\n\n if (parameters.Length == 1 && toolCalled.Function.Arguments != null)\n {\n arg1 = JsonSerializer.Deserialize(\n toolCalled.Function.Arguments.ToString(),\n parameters[0].ParameterType,\n AIConstants.options);\n }\n\n var toolResult = (string?)method.Invoke(fnContainer, parameters.Length == 0 ? null : [arg1]);\n chatRequest.Messages.Add(Message.NewToolMessage(toolResult ?? \"(null)\", toolCalled.Id));\n }\n }\n else\n {\n requiresAction = false;\n if (!string.IsNullOrWhiteSpace(aiMessage.Content))\n {\n message.Reply(\"[AI] \" + aiMessage.Content);\n hasReplied = true;\n }\n }\n }\n\n if (!hasReplied)\n {\n message.Reply(currentTurn >= maxTurns\n ? \":/ İşlem iptal edildi!\"\n : \":/ Yanıt oluşturulamadı!\");\n }\n }\n catch (OperationCanceledException)\n {\n message.Reply(\"Yanıt iptal edildi veya zaman aşımına uğradı!\");\n }\n catch (Exception ex)\n {\n logger.LogError(ex, \"AI Command Error\");\n }\n finally\n {\n sw.Stop();\n string functionLog = calledFunctions.Count > 0 ? string.Join(\", \", calledFunctions) : \"None\";\n\n logger.LogInformation(\n \"AI Finished in {Ms}ms. Turns: {Turns}. Functions: [{Functions}] | Tokens: {Total}\",\n sw.ElapsedMilliseconds,\n currentTurn,\n functionLog,\n totalPromptTokens + totalCompletionTokens\n );\n }\n }\n\n [Command(\"sorw\")]\n [Outgoing]\n public async Task CmdWhitelistAsk(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length != 1)\n return;\n\n string playerQuery = args[0];\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n\n if (commandAskWhitelist.Contains(targetSubject!))\n {\n commandAskWhitelist.Remove(targetSubject!);\n message.ReplySilently(\"Player removed from whitelist\");\n }\n else\n {\n commandAskWhitelist.Add(targetSubject!);\n message.ReplySilently(\"Player added to whitelist\");\n }\n }\n\n [Command(\"soriptal\")]\n [Outgoing]\n public async Task CmdCancelAsk(InGameMessage message)\n {\n message.Drop();\n\n if (cmdAskCts is not null)\n cmdAskCts.Cancel();\n\n message.ReplySilently(\"Command canceled!\");\n }\n\n [Command(\"art\")]\n [Outgoing]\n public void CmdChatArt(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length > 1)\n return;\n\n if (args.Length == 0)\n {\n message.ReplySilently(string.Join(\", \", ArtDictionary.Keys));\n }\n else\n {\n if (ArtDictionary.TryGetValue(args[0], out var msg))\n {\n message.Undrop();\n message.Modify(msg);\n }\n }\n }\n\n private readonly Dictionary<string, string> ArtDictionary = new()\n {\n [\"crab\"] = \"░░░░▄█▀▀▀░░░░░░░░▀▀▀█▄░░░░ ░░▄███▄▄░░▀▄██▄▀░░▄▄███▄░░ ░░▀██▄▄▄▄████████▄▄▄▄██▀░░ ░░░░▄▄▄▄██████████▄▄▄▄░░░░ ░░░▐▐▀▐▀░▀██████▀░▀▌▀░░░░░\",\n [\"love\"] = \"▒▒▒▒▒▒▒▒███▒▒▒███▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒█▒█▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒█▒▒▒█▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"sus\"] = \"░░░░░░░░░███████░░░░░░░░░░ ░░░░░░░░█░░░░░░░█░░░░░░░░░ ░░░░░░░█░░░░░░░░░█░░░░░░░░ ░░░░░░░█░░░███████░░░░░░░░ ░░░░░░░█░░█░░░███░█░░░░░░░ ░░░░░███░░█░░░░██░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░░███████░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░\",\n [\"cat\"] = \"───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█████▒▒▒█────── ──────█▒▒▒▒▒▒▒▒▒▒▒▒▒█───── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒░▒▒▒▒▒▒▒░▒▒▒█──── ──────██▒░▒▒▒█▒▒▒░▒██───── ─────█▒██▒▒▒▒▒▒▒▒▒██▒█──── █████▒▒▒███████████▒▒▒████ ░░░░░███░░░░░░░░░░░███░░░░\",\n [\"ez\"] = \"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓╔═══════╗▓╔═══════╗▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓║★╔═════╝▓║★╔══╗★★║▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓╚═╝▓╔╝★╔╝▓▓▓▓▓▓ ▓║★╚═════╗▓▓▓▓╔╝★╔╝▓▓▓▓▓▓▓ ▓║★╔═════╝▓▓▓╔╝★╔╝▓▓▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓▓╔╝★╔╝╔═╗▓▓▓▓▓▓ ▓║★╚═════╗▓╔╝★★╚═╝★║▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓╚═══════╝▓╚═══════╝▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\",\n [\"nerd\"] = \"────────────████████────── ───────────██████████───── ──────────█▄▄▄████▄▄▄█──── ─────▄───█░░░░░██░░░░░█─── ─────█──░░░▓■▓░░░░▓■▓░░░── ─────█──▐█░▓▓▓░██░▓▓▓░█▌── ─────█──▐██░░░████░░░██▌── ─────█──▐█▛██████████▛█▌── ──▌▌▌▄▄──██▚████████▞██─── ──▌▌▌▀█──████▀████▀████─── ──▄▄▄██───████▄■■▄████──── ──▜███▛────██████████───── ───███──────████████──────\",\n [\"ggez\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░█▀▀▀░█▀▀▀░░█▀▀░▀▀█░░█░░ ░░░█░▀█░█░▀█░░█▀▀░▄▀░░░▀░░ ░░░▀▀▀▀░▀▀▀▀░░▀▀▀░▀▀▀░░▀░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ggwp\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▀▀▀░█▀▀▀░█▐▌█░█▀█░░░░ ░░░░█░▀█░█░▀█░█▐▌█░█▀▀░░░░ ░░░░▀▀▀▀░▀▀▀▀░░▀▀░░▀░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"afk\"] = \"░░█████╗░███████╗██╗░░██╗░ ░██╔══██╗██╔════╝██║░██╔╝░ ░███████║█████╗░░█████═╝░░ ░██╔══██║██╔══╝░░██╔═██╗░░ ░██║░░██║██║░░░░░██║░╚██╗░ ░╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝░\",\n [\"awp\"] = \"╔════════════════════════╗ ║─────────▜████■██───────║ ▄▄▄▄▄▄▄▄▄▄▄▛▀▙██▄███▄▄███▜ ║─────────▗▛▀▀▀▀▀▀▀▀▀▀▀█▀▐ ║──■─■─■──────▝███▄█▌──▀█▐ ║──█─█─█───────▝▀▀─▝█────▀ ╚══▀═▀═▀════════════▀▘═══╝\",\n [\"1tap\"] = \"╔════════════════════════╗ ║░░█░░███░░███░░███░░█░█░║ ║░██░░░█░░░█░█░░█░█░█░█░█║ ║░░█░░░█░░░███░░███░░█░█░║ ║░███░░█░░░█░█░░█░░░░░█░░║ ╚════════════════════════╝\",\n [\"ff\"] = \"────────────────────────── ──────────██████────────── ──▐──────██▀██▀██──────▌── ─▐▐▐────█▄▄████▄▄█────▌▌▌─ ▐▐▐▐───▐█░■░██░■░█▌───▌▌▌▌ ▐███─▄▌▐█░░░██░░░█▌▐▄─███▌ ▐████▀─▐██████████▌─▀████▌ ▐███───▐██████████▌───███▌ ─███───▐████──████▌───███─ ────────████──████──────── ─────────████████───────── ──────────▀▀▀▀▀▀────────── ──────────────────────────\",\n [\"nice\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▄░█░▀█▀░█▀▀░█▀▀░█░░░░ ░░░░█░▀█░░█░░█░░░█▀▀░▀░░░░ ░░░░▀░░▀░▀▀▀░▀▀▀░▀▀▀░▀░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ban\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ▄████▄░░░░░░░░░░░░░░░░░░░░ ██████▄░░░░░░▄▄▄░░░░░░░░░░ ░███▀▀▀▄▄▄▀▀▀░░░░░░░░░░░░░ ░░░▄▀▀▀▄░░░█▀▀▄░▄▀▀▄░█▄░█░ ░░░▄▄████░░█▀▀▄░█▄▄█░█▀▄█░ ░░░░██████░█▄▄▀░█░░█░█░▀█░ ░░░░░▀▀▀▀░░░░░░░░░░░░░░░░░\",\n [\"hmm\"] = \"▒▒▒▒▒▒▒▒▒▄▄▄▄▄▄▄▄▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▄█▀▀░░░░░░▀▀█▄▒▒▒▒▒▒ ▒▒▒▒▄█▀▄██▄░░░░░░░░▀█▄▒▒▒▒ ▒▒▒█▀░▀░░▄▀░░░░▄▀▀▀▀░▀█▒▒▒ ▒▒█▀░░░░███░░░░▄█▄░░░░▀█▒▒ ▒▒█░░░░░░▀░░░░░▀█▀░░░░░█▒▒ ▒▒█░░░░░░░░░░░░░░░░░░░░█▒▒ ▒▒█░░██▄░░▀▀▀▀▄▄░░░░░░░█▒▒ ▒▒▀█░█░█░░░▄▄▄▄▄░░░░░░█▀▒▒ ▒▒▒▀█▀░▀▀▀▀░▄▄▄▀░░░░▄█▀▒▒▒ ▒▒▒▒█░░░░░░▀█░░░░░▄█▀▒▒▒▒▒ ▒▒▒▒█▄░░░░░▀█▄▄▄█▀▀▒▒▒▒▒▒▒ ▒▒▒▒▒▀▀▀▀▀▀▀▒▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"ok\"] = \"░░░░░░░░░░░░░░░░██████░░░░ ░███░░░░░░░░░░██▒▒▒▒▒▒███░ █▒▒▒█░░░░░░░██▒▒▒▒▒▒▒▒▒▒▒█ ░█▒▒▒█░░░░██▒▒▒▒▒▒▒▒▒▒▒▒▒█ ░░█▒▒▒█░░██▒▒██▒▒▒▒██▒▒▒▒▒ ░░░█▒▒▒█░█▒▒▒████▒▒████▒▒▒ ░█████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ █▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ░█▒▒▒█████▒▒█▒▒▒▒▒▒▒▒▒██▒▒ █▒▒▒▒▒▒▒▒▒█▒███████████▒▒▒ ░█▒▒▒█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░█▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒██ ░░░███████░░█▒▒▒▒▒▒▒▒▒███░\",\n };\n }\n}\n"}, "be51af262017437e4bfeeee61a89c546281bcbdc": {"t": 1785756592.3805544, "n": 22904, "h": "84370a0d7e9f8f97", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.RegularExpressions;\nusing ValSharp.Content;\nusing ValSharp.Core;\nusing ValSharp.Interceptors;\nusing YamlDotNet.Core.Tokens;\n\nnamespace ValSharp_Demo\n{\n internal class CommandContainer\n {\n private readonly ValClient valClient;\n private readonly ILogger<CommandContainer> logger;\n private readonly DeepSeekClient deepSeekClient = new DeepSeekClient(AIConstants.DEEPSEEK_API_KEY);\n private readonly HashSet<string> commandAskWhitelist = new();\n private CancellationTokenSource? cmdAskCts;\n \n public CommandContainer(ValClient client, ILoggerFactory loggerFactory)\n {\n valClient = client;\n logger = loggerFactory.CreateLogger<CommandContainer>();\n }\n\n [Command(\"ai\")]\n [Outgoing]\n public async Task CmdAISwitch(InGameMessage message)\n {\n MiddlewareContainer.IsAIResponseEnabled = !MiddlewareContainer.IsAIResponseEnabled;\n string msg = $\"AI {(MiddlewareContainer.IsAIResponseEnabled ? \"Enabled\" : \"Disabled\")}\";\n\n message.Drop();\n message.ReplySilently(msg);\n logger?.LogInformation(msg);\n }\n\n [Command(\"r\")]\n [Outgoing]\n public async Task CmdAIReply(InGameMessage message, string[] args)\n {\n message.Drop();\n\n string? puuid = MiddlewareContainer.LastMessagePlayerPUUID;\n\n if (args.Length >= 1)\n {\n if (!InGameCache.Instance.TryFindPlayer(args[0], out puuid, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n }\n\n if (puuid is null || !MiddlewareContainer.LastPlayerMessages.TryGetValue(puuid, out string? lastMessage))\n return;\n\n var chatRequest = AIConstants.YAPISTIR();\n chatRequest.Messages.Add(Message.NewUserMessage(lastMessage!));\n\n var chatResponse = await deepSeekClient.ChatAsync(chatRequest, new CancellationToken());\n string? textResponse = chatResponse?.Choices?.FirstOrDefault()?.Message?.Content;\n\n if (string.IsNullOrEmpty(textResponse))\n return;\n\n message.Undrop();\n message.Modify(textResponse!);\n logger.LogDebug(\"AI Response: \" + textResponse!);\n }\n\n [Command(\"kimin\")]\n public async Task CmdWhose(InGameMessage message, string[] args)\n {\n (Weapon? weapon, Skin? skin) ResolveWeaponAndSkin(string arg1, string arg2)\n {\n var weaponA = InGameCache.Instance.FindWeapon(arg1);\n var skinA = weaponA != null ? InGameCache.Instance.FindSkin(weaponA, arg2) : null;\n\n if (weaponA != null && skinA != null) return (weaponA, skinA);\n\n var weaponB = InGameCache.Instance.FindWeapon(arg2);\n var skinB = weaponB != null ? InGameCache.Instance.FindSkin(weaponB, arg1) : null;\n\n if (weaponB != null && skinB != null) return (weaponB, skinB);\n\n return weaponA != null ? (weaponA, skinA) : (weaponB, skinB);\n }\n\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string arg1 = args[0];\n string arg2 = args[1];\n\n if (arg1.Length < 2 || arg2.Length < 2)\n {\n message.Reply(\"Hatalı kullanım!\");\n return;\n }\n\n var (weapon, skin) = ResolveWeaponAndSkin(arg1, arg2);\n\n if (weapon == null || skin == null)\n {\n message.Reply(\"Bulunamadı :(\");\n return;\n }\n\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n var matchingLoadouts = InGameCache.Instance.MatchLoadouts!\n .Where(ml => ml.Items.TryGetValue(weapon.Uuid, out var item) &&\n item.Sockets[skinSocketId].Item.ID == skin.Uuid)\n .ToList();\n\n if (!matchingLoadouts.Any())\n {\n message.Reply($\"{skin.DisplayName} {weapon.DisplayName} kimsede yok.\");\n return;\n }\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = matchingLoadouts.Select(loadout =>\n {\n var owner = InGameCache.Instance.Match!.Players[loadout.Subject];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"s\")]\n public async Task CmdSkin(InGameMessage message, string[] args)\n {\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n string weaponQuery = args[1];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var weapon = InGameCache.Instance.FindWeapon(weaponQuery);\n if (weapon == null)\n {\n message.Reply(\"Silah bulunamadı!\");\n return;\n }\n\n var playerLoadout = InGameCache.Instance.MatchLoadouts!.FirstOrDefault(ml => ml.Subject == targetSubject);\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n\n if (playerLoadout != null && playerLoadout.Items.TryGetValue(weapon.Uuid, out var weaponItem))\n {\n var skinUuid = weaponItem.Sockets[skinSocketId].Item.ID;\n var skin = weapon.Skins.FirstOrDefault(s => s.Uuid == skinUuid);\n\n string response = skin != null ? skin.DisplayName : \"Standart\";\n message.Reply(response);\n }\n else\n {\n message.Reply(\"Silah verisi bulunamadı!\");\n }\n }\n\n [Command(\"rank\")]\n public async Task CmdRank(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents) || targetSubject is null)\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var activeSeason = InGameCache.Instance.Seasons!.FirstOrDefault(s => s.IsActive);\n var targetPlayer = InGameCache.Instance.Match!.Players[targetSubject!];\n var rankDetails = InGameCache.Instance.GetPlayerRankDetails(targetSubject!, activeSeason!.ID);\n\n if (rankDetails is null)\n {\n message.Reply(\"Oyuncunun rank detayları alınamadı!\");\n return;\n }\n\n string currentRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Current].TierName;\n string peakRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Peak].TierName;\n string avgRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Avg].TierName;\n\n message.Reply($\"{(!targetPlayer.PlayerIdentity.HideAccountLevel ? $\"Seviye: {targetPlayer.PlayerIdentity.AccountLevel}, \" : string.Empty)}Mevcut: {currentRankName}, Ortalama: {avgRankName}, Max: {peakRankName}\");\n }\n\n [Command(\"party\")]\n public async Task CmdParty(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMsg = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMsg);\n return;\n }\n\n string? commonPartyId = InGameCache.Instance!.PlayerPartyLookup?.FirstOrDefault(x => x.Contains(targetSubject!))?.Key;\n\n if (commonPartyId is null)\n {\n message.Reply(\"Grup bilgisi alınamadı!\");\n return;\n }\n\n var puuidCollection = InGameCache.Instance!.PlayerPartyLookup![commonPartyId!];\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = puuidCollection.Select(puuid =>\n {\n var owner = InGameCache.Instance.Match!.Players[puuid];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"sor\")]\n public async Task CmdAsk(InGameMessage message, string[] args)\n {\n if (args.Length == 0 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded || valClient.GameState != GameState.InGame)\n return;\n\n if (message.FromSubject != valClient.Auth.Subject && !commandAskWhitelist.Contains(message.FromSubject))\n {\n message.Reply(\"Bu komutu kullanma yetkiniz yok!\");\n return;\n }\n\n string question = string.Join(' ', args);\n if (question.Length > 400) return;\n\n cmdAskCts?.Dispose();\n cmdAskCts = new CancellationTokenSource();\n cmdAskCts.CancelAfter(TimeSpan.FromSeconds(45));\n\n int totalPromptTokens = 0;\n int totalCompletionTokens = 0;\n int currentTurn = 0;\n var calledFunctions = new List<string>();\n var sw = Stopwatch.StartNew();\n\n try\n {\n var fnContainer = new AIFunctions(valClient, message.FromSubject);\n var toolMethodMap = typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance)\n .ToDictionary(m => m.Name);\n\n var chatRequest = AIConstants.SOR();\n chatRequest.Messages.Add(Message.NewSystemMessage(\"Crnt Game Details;\\n\" + fnContainer.CurrentGame()));\n chatRequest.Messages.Add(Message.NewUserMessage(question));\n\n bool requiresAction = true;\n bool hasReplied = false;\n const int maxTurns = 3;\n\n while (requiresAction && currentTurn < maxTurns)\n {\n cmdAskCts.Token.ThrowIfCancellationRequested();\n\n var response = await deepSeekClient.ChatAsync(chatRequest, cmdAskCts.Token);\n if (response?.Choices == null || response.Choices.Count == 0) break;\n\n if (response.Usage != null)\n {\n totalPromptTokens += response.Usage.PromptTokens;\n totalCompletionTokens += response.Usage.CompletionTokens;\n }\n\n var aiMessage = response.Choices[0].Message;\n if (aiMessage is null) break;\n\n chatRequest.Messages.Add(aiMessage);\n\n if (aiMessage.ToolCalls != null && aiMessage.ToolCalls.Count > 0)\n {\n currentTurn++;\n\n foreach (var toolCalled in aiMessage.ToolCalls)\n {\n if (toolCalled?.Function == null) continue;\n calledFunctions.Add(toolCalled.Function.Name);\n\n if (!toolMethodMap.TryGetValue(toolCalled.Function.Name, out MethodInfo? method)) continue;\n\n var parameters = method.GetParameters();\n object? arg1 = null;\n\n if (parameters.Length == 1 && toolCalled.Function.Arguments != null)\n {\n arg1 = JsonSerializer.Deserialize(\n toolCalled.Function.Arguments.ToString(),\n parameters[0].ParameterType,\n AIConstants.options);\n }\n\n var toolResult = (string?)method.Invoke(fnContainer, parameters.Length == 0 ? null : [arg1]);\n chatRequest.Messages.Add(Message.NewToolMessage(toolResult ?? \"(null)\", toolCalled.Id));\n }\n }\n else\n {\n requiresAction = false;\n if (!string.IsNullOrWhiteSpace(aiMessage.Content))\n {\n message.Reply(\"[AI] \" + aiMessage.Content);\n hasReplied = true;\n }\n }\n }\n\n if (!hasReplied)\n {\n message.Reply(currentTurn >= maxTurns\n ? \":/ İşlem iptal edildi!\"\n : \":/ Yanıt oluşturulamadı!\");\n }\n }\n catch (OperationCanceledException)\n {\n message.Reply(\"Yanıt iptal edildi veya zaman aşımına uğradı!\");\n }\n catch (Exception ex)\n {\n logger.LogError(ex, \"AI Command Error\");\n }\n finally\n {\n sw.Stop();\n string functionLog = calledFunctions.Count > 0 ? string.Join(\", \", calledFunctions) : \"None\";\n\n logger.LogInformation(\n \"AI Finished in {Ms}ms. Turns: {Turns}. Functions: [{Functions}] | Tokens: {Total}\",\n sw.ElapsedMilliseconds,\n currentTurn,\n functionLog,\n totalPromptTokens + totalCompletionTokens\n );\n }\n }\n\n [Command(\"sorw\")]\n [Outgoing]\n public async Task CmdWhitelistAsk(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length != 1)\n return;\n\n string playerQuery = args[0];\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n\n if (commandAskWhitelist.Contains(targetSubject!))\n {\n commandAskWhitelist.Remove(targetSubject!);\n message.ReplySilently(\"Player removed from whitelist\");\n }\n else\n {\n commandAskWhitelist.Add(targetSubject!);\n message.ReplySilently(\"Player added to whitelist\");\n }\n }\n\n [Command(\"soriptal\")]\n [Outgoing]\n public async Task CmdCancelAsk(InGameMessage message)\n {\n message.Drop();\n\n if (cmdAskCts is not null)\n cmdAskCts.Cancel();\n\n message.ReplySilently(\"Command canceled!\");\n }\n\n [Command(\"art\")]\n [Outgoing]\n public void CmdChatArt(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length > 1)\n return;\n\n if (args.Length == 0)\n {\n message.ReplySilently(string.Join(\", \", ArtDictionary.Keys));\n }\n else\n {\n if (ArtDictionary.TryGetValue(args[0], out var msg))\n {\n message.Undrop();\n message.Modify(msg);\n }\n }\n }\n\n private readonly Dictionary<string, string> ArtDictionary = new()\n {\n [\"crab\"] = \"░░░░▄█▀▀▀░░░░░░░░▀▀▀█▄░░░░ ░░▄███▄▄░░▀▄██▄▀░░▄▄███▄░░ ░░▀██▄▄▄▄████████▄▄▄▄██▀░░ ░░░░▄▄▄▄██████████▄▄▄▄░░░░ ░░░▐▐▀▐▀░▀██████▀░▀▌▀░░░░░\",\n [\"love\"] = \"▒▒▒▒▒▒▒▒███▒▒▒███▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒█▒█▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒█▒▒▒█▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"sus\"] = \"░░░░░░░░░███████░░░░░░░░░░ ░░░░░░░░█░░░░░░░█░░░░░░░░░ ░░░░░░░█░░░░░░░░░█░░░░░░░░ ░░░░░░░█░░░███████░░░░░░░░ ░░░░░░░█░░█░░░███░█░░░░░░░ ░░░░░███░░█░░░░██░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░░███████░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░\",\n [\"cat\"] = \"───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█████▒▒▒█────── ──────█▒▒▒▒▒▒▒▒▒▒▒▒▒█───── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒░▒▒▒▒▒▒▒░▒▒▒█──── ──────██▒░▒▒▒█▒▒▒░▒██───── ─────█▒██▒▒▒▒▒▒▒▒▒██▒█──── █████▒▒▒███████████▒▒▒████ ░░░░░███░░░░░░░░░░░███░░░░\",\n [\"ez\"] = \"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓╔═══════╗▓╔═══════╗▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓║★╔═════╝▓║★╔══╗★★║▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓╚═╝▓╔╝★╔╝▓▓▓▓▓▓ ▓║★╚═════╗▓▓▓▓╔╝★╔╝▓▓▓▓▓▓▓ ▓║★╔═════╝▓▓▓╔╝★╔╝▓▓▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓▓╔╝★╔╝╔═╗▓▓▓▓▓▓ ▓║★╚═════╗▓╔╝★★╚═╝★║▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓╚═══════╝▓╚═══════╝▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\",\n [\"nerd\"] = \"────────────████████────── ───────────██████████───── ──────────█▄▄▄████▄▄▄█──── ─────▄───█░░░░░██░░░░░█─── ─────█──░░░▓■▓░░░░▓■▓░░░── ─────█──▐█░▓▓▓░██░▓▓▓░█▌── ─────█──▐██░░░████░░░██▌── ─────█──▐█▛██████████▛█▌── ──▌▌▌▄▄──██▚████████▞██─── ──▌▌▌▀█──████▀████▀████─── ──▄▄▄██───████▄■■▄████──── ──▜███▛────██████████───── ───███──────████████──────\",\n [\"ggez\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░█▀▀▀░█▀▀▀░░█▀▀░▀▀█░░█░░ ░░░█░▀█░█░▀█░░█▀▀░▄▀░░░▀░░ ░░░▀▀▀▀░▀▀▀▀░░▀▀▀░▀▀▀░░▀░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ggwp\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▀▀▀░█▀▀▀░█▐▌█░█▀█░░░░ ░░░░█░▀█░█░▀█░█▐▌█░█▀▀░░░░ ░░░░▀▀▀▀░▀▀▀▀░░▀▀░░▀░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"afk\"] = \"░░█████╗░███████╗██╗░░██╗░ ░██╔══██╗██╔════╝██║░██╔╝░ ░███████║█████╗░░█████═╝░░ ░██╔══██║██╔══╝░░██╔═██╗░░ ░██║░░██║██║░░░░░██║░╚██╗░ ░╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝░\",\n [\"awp\"] = \"╔════════════════════════╗ ║─────────▜████■██───────║ ▄▄▄▄▄▄▄▄▄▄▄▛▀▙██▄███▄▄███▜ ║─────────▗▛▀▀▀▀▀▀▀▀▀▀▀█▀▐ ║──■─■─■──────▝███▄█▌──▀█▐ ║──█─█─█───────▝▀▀─▝█────▀ ╚══▀═▀═▀════════════▀▘═══╝\",\n [\"1tap\"] = \"╔════════════════════════╗ ║░░█░░███░░███░░███░░█░█░║ ║░██░░░█░░░█░█░░█░█░█░█░█║ ║░░█░░░█░░░███░░███░░█░█░║ ║░███░░█░░░█░█░░█░░░░░█░░║ ╚════════════════════════╝\",\n [\"ff\"] = \"────────────────────────── ──────────██████────────── ──▐──────██▀██▀██──────▌── ─▐▐▐────█▄▄████▄▄█────▌▌▌─ ▐▐▐▐───▐█░■░██░■░█▌───▌▌▌▌ ▐███─▄▌▐█░░░██░░░█▌▐▄─███▌ ▐████▀─▐██████████▌─▀████▌ ▐███───▐██████████▌───███▌ ─███───▐████──████▌───███─ ────────████──████──────── ─────────████████───────── ──────────▀▀▀▀▀▀────────── ──────────────────────────\",\n [\"nice\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▄░█░▀█▀░█▀▀░█▀▀░█░░░░ ░░░░█░▀█░░█░░█░░░█▀▀░▀░░░░ ░░░░▀░░▀░▀▀▀░▀▀▀░▀▀▀░▀░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ban\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ▄████▄░░░░░░░░░░░░░░░░░░░░ ██████▄░░░░░░▄▄▄░░░░░░░░░░ ░███▀▀▀▄▄▄▀▀▀░░░░░░░░░░░░░ ░░░▄▀▀▀▄░░░█▀▀▄░▄▀▀▄░█▄░█░ ░░░▄▄████░░█▀▀▄░█▄▄█░█▀▄█░ ░░░░██████░█▄▄▀░█░░█░█░▀█░ ░░░░░▀▀▀▀░░░░░░░░░░░░░░░░░\",\n [\"hmm\"] = \"▒▒▒▒▒▒▒▒▒▄▄▄▄▄▄▄▄▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▄█▀▀░░░░░░▀▀█▄▒▒▒▒▒▒ ▒▒▒▒▄█▀▄██▄░░░░░░░░▀█▄▒▒▒▒ ▒▒▒█▀░▀░░▄▀░░░░▄▀▀▀▀░▀█▒▒▒ ▒▒█▀░░░░███░░░░▄█▄░░░░▀█▒▒ ▒▒█░░░░░░▀░░░░░▀█▀░░░░░█▒▒ ▒▒█░░░░░░░░░░░░░░░░░░░░█▒▒ ▒▒█░░██▄░░▀▀▀▀▄▄░░░░░░░█▒▒ ▒▒▀█░█░█░░░▄▄▄▄▄░░░░░░█▀▒▒ ▒▒▒▀█▀░▀▀▀▀░▄▄▄▀░░░░▄█▀▒▒▒ ▒▒▒▒█░░░░░░▀█░░░░░▄█▀▒▒▒▒▒ ▒▒▒▒█▄░░░░░▀█▄▄▄█▀▀▒▒▒▒▒▒▒ ▒▒▒▒▒▀▀▀▀▀▀▀▒▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"ok\"] = \"░░░░░░░░░░░░░░░░██████░░░░ ░███░░░░░░░░░░██▒▒▒▒▒▒███░ █▒▒▒█░░░░░░░██▒▒▒▒▒▒▒▒▒▒▒█ ░█▒▒▒█░░░░██▒▒▒▒▒▒▒▒▒▒▒▒▒█ ░░█▒▒▒█░░██▒▒██▒▒▒▒██▒▒▒▒▒ ░░░█▒▒▒█░█▒▒▒████▒▒████▒▒▒ ░█████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ █▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ░█▒▒▒█████▒▒█▒▒▒▒▒▒▒▒▒██▒▒ █▒▒▒▒▒▒▒▒▒█▒███████████▒▒▒ ░█▒▒▒█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░█▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒██ ░░░███████░░█▒▒▒▒▒▒▒▒▒███░\",\n };\n }\n}\n"}, "e22cfd10112fc3aecb63f6db22b38d24ae2e10fd": {"t": 1785756593.759079, "n": 22879, "h": "60dbd2f3c2a00d63", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.RegularExpressions;\nusing ValSharp.Content;\nusing ValSharp.Core;\nusing ValSharp.Interceptors;\nusing YamlDotNet.Core.Tokens;\n\nnamespace ValSharp_Demo\n{\n internal class CommandContainer\n {\n private readonly ValClient valClient;\n private readonly ILogger<CommandContainer> logger;\n private readonly DeepSeekClient deepSeekClient = new DeepSeekClient(AIConstants.DEEPSEEK_API_KEY);\n private readonly HashSet<string> commandAskWhitelist = new();\n private CancellationTokenSource? cmdAskCts;\n \n public CommandContainer(ValClient client, ILoggerFactory loggerFactory)\n {\n valClient = client;\n logger = loggerFactory.CreateLogger<CommandContainer>();\n }\n\n [Command(\"ai\")]\n [Outgoing]\n public async Task CmdAISwitch(InGameMessage message)\n {\n MiddlewareContainer.IsAIResponseEnabled = !MiddlewareContainer.IsAIResponseEnabled;\n string msg = $\"AI {(MiddlewareContainer.IsAIResponseEnabled ? \"Enabled\" : \"Disabled\")}\";\n\n message.Drop();\n message.ReplySilently(msg);\n logger?.LogInformation(msg);\n }\n\n [Command(\"r\")]\n [Outgoing]\n public async Task CmdAIReply(InGameMessage message, string[] args)\n {\n message.Drop();\n\n string? puuid = MiddlewareContainer.LastMessagePlayerPUUID;\n\n if (args.Length >= 1)\n {\n if (!InGameCache.Instance.TryFindPlayer(args[0], out puuid, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n }\n\n if (puuid is null || !MiddlewareContainer.LastPlayerMessages.TryGetValue(puuid, out string? lastMessage))\n return;\n\n var chatRequest = AIConstants.YAPISTIR();\n chatRequest.Messages.Add(Message.NewUserMessage(lastMessage!));\n\n var chatResponse = await deepSeekClient.ChatAsync(chatRequest, new CancellationToken());\n string? textResponse = chatResponse?.Choices?.FirstOrDefault()?.Message?.Content;\n\n if (string.IsNullOrEmpty(textResponse))\n return;\n\n message.Undrop();\n message.Modify(textResponse!);\n logger.LogDebug(\"AI Response: \" + textResponse!);\n }\n\n [Command(\"kimin\")]\n public async Task CmdWhose(InGameMessage message, string[] args)\n {\n (Weapon? weapon, Skin? skin) ResolveWeaponAndSkin(string arg1, string arg2)\n {\n var weaponA = InGameCache.Instance.FindWeapon(arg1);\n var skinA = weaponA != null ? InGameCache.Instance.FindSkin(weaponA, arg2) : null;\n\n if (weaponA != null && skinA != null) return (weaponA, skinA);\n\n var weaponB = InGameCache.Instance.FindWeapon(arg2);\n var skinB = weaponB != null ? InGameCache.Instance.FindSkin(weaponB, arg1) : null;\n\n if (weaponB != null && skinB != null) return (weaponB, skinB);\n\n return weaponA != null ? (weaponA, skinA) : (weaponB, skinB);\n }\n\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string arg1 = args[0];\n string arg2 = args[1];\n\n if (arg1.Length < 2 || arg2.Length < 2)\n {\n message.Reply(\"Hatalı kullanım!\");\n return;\n }\n\n var (weapon, skin) = ResolveWeaponAndSkin(arg1, arg2);\n\n if (weapon == null || skin == null)\n {\n message.Reply(\"Bulunamadı :(\");\n return;\n }\n\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n var matchingLoadouts = InGameCache.Instance.MatchLoadouts!\n .Where(ml => ml.Items.TryGetValue(weapon.Uuid, out var item) &&\n item.Sockets[skinSocketId].Item.ID == skin.Uuid)\n .ToList();\n\n if (!matchingLoadouts.Any())\n {\n message.Reply($\"{skin.DisplayName} {weapon.DisplayName} kimsede yok.\");\n return;\n }\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = matchingLoadouts.Select(loadout =>\n {\n var owner = InGameCache.Instance.Match!.Players[loadout.Subject];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"s\")]\n public async Task CmdSkin(InGameMessage message, string[] args)\n {\n if (args.Length != 2 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n string weaponQuery = args[1];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var weapon = InGameCache.Instance.FindWeapon(weaponQuery);\n if (weapon == null)\n {\n message.Reply(\"Silah bulunamadı!\");\n return;\n }\n\n var playerLoadout = InGameCache.Instance.MatchLoadouts!.FirstOrDefault(ml => ml.Subject == targetSubject);\n var skinSocketId = ValContent.Sockets[ValContent.SocketType.Skin];\n\n if (playerLoadout != null && playerLoadout.Items.TryGetValue(weapon.Uuid, out var weaponItem))\n {\n var skinUuid = weaponItem.Sockets[skinSocketId].Item.ID;\n var skin = weapon.Skins.FirstOrDefault(s => s.Uuid == skinUuid);\n\n string response = skin != null ? skin.DisplayName : \"Standart\";\n message.Reply(response);\n }\n else\n {\n message.Reply(\"Silah verisi bulunamadı!\");\n }\n }\n\n [Command(\"rank\")]\n public async Task CmdRank(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMessage);\n return;\n }\n\n var activeSeason = InGameCache.Instance.Seasons!.FirstOrDefault(s => s.IsActive);\n var targetPlayer = InGameCache.Instance.Match!.Players[targetSubject!];\n var rankDetails = InGameCache.Instance.GetPlayerRankDetails(targetSubject!, activeSeason!.ID);\n\n if (rankDetails is null)\n {\n message.Reply(\"Oyuncunun rank detayları alınamadı!\");\n return;\n }\n\n string currentRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Current].TierName;\n string peakRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Peak].TierName;\n string avgRankName = InGameCache.Instance.CompetitiveTiers.Value!.Last().Tiers[rankDetails.Value.Avg].TierName;\n\n message.Reply($\"{(!targetPlayer.PlayerIdentity.HideAccountLevel ? $\"Seviye: {targetPlayer.PlayerIdentity.AccountLevel}, \" : string.Empty)}Mevcut: {currentRankName}, Ortalama: {avgRankName}, Max: {peakRankName}\");\n }\n\n [Command(\"party\")]\n public async Task CmdParty(InGameMessage message, string[] args)\n {\n if (args.Length != 1 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded)\n return;\n\n string playerQuery = args[0];\n\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMsg = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.Reply(replyMsg);\n return;\n }\n\n string? commonPartyId = InGameCache.Instance!.PlayerPartyLookup?.FirstOrDefault(x => x.Contains(targetSubject!))?.Key;\n\n if (commonPartyId is null)\n {\n message.Reply(\"Grup bilgisi alınamadı!\");\n return;\n }\n\n var puuidCollection = InGameCache.Instance!.PlayerPartyLookup![commonPartyId!];\n\n var playerRequester = InGameCache.Instance.Match!.Players[message.FromSubject];\n var resultList = puuidCollection.Select(puuid =>\n {\n var owner = InGameCache.Instance.Match!.Players[puuid];\n var agent = InGameCache.Instance.Agents![owner.CharacterID.ToUpper()];\n\n bool isEnemy = !owner.TeamID.ToLower().Equals(playerRequester.TeamID.ToLower());\n bool hasDuplicateAgent = InGameCache.Instance.Match.Players.Values\n .Count(p => p.CharacterID.ToLower().Equals(owner.CharacterID.ToLower())) > 1;\n\n return hasDuplicateAgent ? $\"{(isEnemy ? \"2\" : \"1\")}.{agent.DisplayName}\" : agent.DisplayName;\n });\n\n message.Reply(string.Join(\", \", resultList));\n }\n\n [Command(\"sor\")]\n public async Task CmdAsk(InGameMessage message, string[] args)\n {\n if (args.Length == 0 || !InGameCache.Instance.IsMatchDataLoaded || !InGameCache.Instance.IsContentDataLoaded || valClient.GameState != GameState.InGame)\n return;\n\n if (message.FromSubject != valClient.Auth.Subject && !commandAskWhitelist.Contains(message.FromSubject))\n {\n message.Reply(\"Bu komutu kullanma yetkiniz yok!\");\n return;\n }\n\n string question = string.Join(' ', args);\n if (question.Length > 400) return;\n\n cmdAskCts?.Dispose();\n cmdAskCts = new CancellationTokenSource();\n cmdAskCts.CancelAfter(TimeSpan.FromSeconds(45));\n\n int totalPromptTokens = 0;\n int totalCompletionTokens = 0;\n int currentTurn = 0;\n var calledFunctions = new List<string>();\n var sw = Stopwatch.StartNew();\n\n try\n {\n var fnContainer = new AIFunctions(valClient, message.FromSubject);\n var toolMethodMap = typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance)\n .ToDictionary(m => m.Name);\n\n var chatRequest = AIConstants.SOR();\n chatRequest.Messages.Add(Message.NewSystemMessage(\"Crnt Game Details;\\n\" + fnContainer.CurrentGame()));\n chatRequest.Messages.Add(Message.NewUserMessage(question));\n\n bool requiresAction = true;\n bool hasReplied = false;\n const int maxTurns = 3;\n\n while (requiresAction && currentTurn < maxTurns)\n {\n cmdAskCts.Token.ThrowIfCancellationRequested();\n\n var response = await deepSeekClient.ChatAsync(chatRequest, cmdAskCts.Token);\n if (response?.Choices == null || response.Choices.Count == 0) break;\n\n if (response.Usage != null)\n {\n totalPromptTokens += response.Usage.PromptTokens;\n totalCompletionTokens += response.Usage.CompletionTokens;\n }\n\n var aiMessage = response.Choices[0].Message;\n if (aiMessage is null) break;\n\n chatRequest.Messages.Add(aiMessage);\n\n if (aiMessage.ToolCalls != null && aiMessage.ToolCalls.Count > 0)\n {\n currentTurn++;\n\n foreach (var toolCalled in aiMessage.ToolCalls)\n {\n if (toolCalled?.Function == null) continue;\n calledFunctions.Add(toolCalled.Function.Name);\n\n if (!toolMethodMap.TryGetValue(toolCalled.Function.Name, out MethodInfo? method)) continue;\n\n var parameters = method.GetParameters();\n object? arg1 = null;\n\n if (parameters.Length == 1 && toolCalled.Function.Arguments != null)\n {\n arg1 = JsonSerializer.Deserialize(\n toolCalled.Function.Arguments.ToString(),\n parameters[0].ParameterType,\n AIConstants.options);\n }\n\n var toolResult = (string?)method.Invoke(fnContainer, parameters.Length == 0 ? null : [arg1]);\n chatRequest.Messages.Add(Message.NewToolMessage(toolResult ?? \"(null)\", toolCalled.Id));\n }\n }\n else\n {\n requiresAction = false;\n if (!string.IsNullOrWhiteSpace(aiMessage.Content))\n {\n message.Reply(\"[AI] \" + aiMessage.Content);\n hasReplied = true;\n }\n }\n }\n\n if (!hasReplied)\n {\n message.Reply(currentTurn >= maxTurns\n ? \":/ İşlem iptal edildi!\"\n : \":/ Yanıt oluşturulamadı!\");\n }\n }\n catch (OperationCanceledException)\n {\n message.Reply(\"Yanıt iptal edildi veya zaman aşımına uğradı!\");\n }\n catch (Exception ex)\n {\n logger.LogError(ex, \"AI Command Error\");\n }\n finally\n {\n sw.Stop();\n string functionLog = calledFunctions.Count > 0 ? string.Join(\", \", calledFunctions) : \"None\";\n\n logger.LogInformation(\n \"AI Finished in {Ms}ms. Turns: {Turns}. Functions: [{Functions}] | Tokens: {Total}\",\n sw.ElapsedMilliseconds,\n currentTurn,\n functionLog,\n totalPromptTokens + totalCompletionTokens\n );\n }\n }\n\n [Command(\"sorw\")]\n [Outgoing]\n public async Task CmdWhitelistAsk(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length != 1)\n return;\n\n string playerQuery = args[0];\n string? targetSubject = null;\n\n if (!InGameCache.Instance.TryFindPlayer(playerQuery, out targetSubject, out bool hasMultipleAgents))\n {\n string replyMessage = hasMultipleAgents ? \"Birden fazla oyuncu bulundu! Karakter adının başına aynı takım için 1. karşı takım için 2. koyarak tekrar deneyin.\" : \"Oyuncu bulunamadı!\";\n message.ReplySilently(replyMessage);\n return;\n }\n\n if (commandAskWhitelist.Contains(targetSubject!))\n {\n commandAskWhitelist.Remove(targetSubject!);\n message.ReplySilently(\"Player removed from whitelist\");\n }\n else\n {\n commandAskWhitelist.Add(targetSubject!);\n message.ReplySilently(\"Player added to whitelist\");\n }\n }\n\n [Command(\"soriptal\")]\n [Outgoing]\n public async Task CmdCancelAsk(InGameMessage message)\n {\n message.Drop();\n\n if (cmdAskCts is not null)\n cmdAskCts.Cancel();\n\n message.ReplySilently(\"Command canceled!\");\n }\n\n [Command(\"art\")]\n [Outgoing]\n public void CmdChatArt(InGameMessage message, string[] args)\n {\n message.Drop();\n\n if (args.Length > 1)\n return;\n\n if (args.Length == 0)\n {\n message.ReplySilently(string.Join(\", \", ArtDictionary.Keys));\n }\n else\n {\n if (ArtDictionary.TryGetValue(args[0], out var msg))\n {\n message.Undrop();\n message.Modify(msg);\n }\n }\n }\n\n private readonly Dictionary<string, string> ArtDictionary = new()\n {\n [\"crab\"] = \"░░░░▄█▀▀▀░░░░░░░░▀▀▀█▄░░░░ ░░▄███▄▄░░▀▄██▄▀░░▄▄███▄░░ ░░▀██▄▄▄▄████████▄▄▄▄██▀░░ ░░░░▄▄▄▄██████████▄▄▄▄░░░░ ░░░▐▐▀▐▀░▀██████▀░▀▌▀░░░░░\",\n [\"love\"] = \"▒▒▒▒▒▒▒▒███▒▒▒███▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒█▒█▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒ ▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒█▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒█▒▒▒█▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒█▒█▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒█▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"sus\"] = \"░░░░░░░░░███████░░░░░░░░░░ ░░░░░░░░█░░░░░░░█░░░░░░░░░ ░░░░░░░█░░░░░░░░░█░░░░░░░░ ░░░░░░░█░░░███████░░░░░░░░ ░░░░░░░█░░█░░░███░█░░░░░░░ ░░░░░███░░█░░░░██░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░█░░░░░░░█░░░░░░░ ░░░░█░░█░░░███████░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░ ░░░░█░░█░░░░░░░░░█░░░░░░░░\",\n [\"cat\"] = \"───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█───█▒▒▒█────── ───────█▒▒▒█████▒▒▒█────── ──────█▒▒▒▒▒▒▒▒▒▒▒▒▒█───── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒█▒▒▒▒▒▒▒█▒▒▒█──── ─────█▒▒▒░▒▒▒▒▒▒▒░▒▒▒█──── ──────██▒░▒▒▒█▒▒▒░▒██───── ─────█▒██▒▒▒▒▒▒▒▒▒██▒█──── █████▒▒▒███████████▒▒▒████ ░░░░░███░░░░░░░░░░░███░░░░\",\n [\"ez\"] = \"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ▓╔═══════╗▓╔═══════╗▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓║★╔═════╝▓║★╔══╗★★║▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓╚═╝▓╔╝★╔╝▓▓▓▓▓▓ ▓║★╚═════╗▓▓▓▓╔╝★╔╝▓▓▓▓▓▓▓ ▓║★╔═════╝▓▓▓╔╝★╔╝▓▓▓▓▓▓▓▓ ▓║★║▓▓▓▓▓▓▓▓╔╝★╔╝╔═╗▓▓▓▓▓▓ ▓║★╚═════╗▓╔╝★★╚═╝★║▓▓▓▓▓▓ ▓║★★★★★★★║▓║★★★★★★★║▓▓▓▓▓▓ ▓╚═══════╝▓╚═══════╝▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\",\n [\"nerd\"] = \"────────────████████────── ───────────██████████───── ──────────█▄▄▄████▄▄▄█──── ─────▄───█░░░░░██░░░░░█─── ─────█──░░░▓■▓░░░░▓■▓░░░── ─────█──▐█░▓▓▓░██░▓▓▓░█▌── ─────█──▐██░░░████░░░██▌── ─────█──▐█▛██████████▛█▌── ──▌▌▌▄▄──██▚████████▞██─── ──▌▌▌▀█──████▀████▀████─── ──▄▄▄██───████▄■■▄████──── ──▜███▛────██████████───── ───███──────████████──────\",\n [\"ggez\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░█▀▀▀░█▀▀▀░░█▀▀░▀▀█░░█░░ ░░░█░▀█░█░▀█░░█▀▀░▄▀░░░▀░░ ░░░▀▀▀▀░▀▀▀▀░░▀▀▀░▀▀▀░░▀░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ggwp\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▀▀▀░█▀▀▀░█▐▌█░█▀█░░░░ ░░░░█░▀█░█░▀█░█▐▌█░█▀▀░░░░ ░░░░▀▀▀▀░▀▀▀▀░░▀▀░░▀░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"afk\"] = \"░░█████╗░███████╗██╗░░██╗░ ░██╔══██╗██╔════╝██║░██╔╝░ ░███████║█████╗░░█████═╝░░ ░██╔══██║██╔══╝░░██╔═██╗░░ ░██║░░██║██║░░░░░██║░╚██╗░ ░╚═╝░░╚═╝╚═╝░░░░░╚═╝░░╚═╝░\",\n [\"awp\"] = \"╔════════════════════════╗ ║─────────▜████■██───────║ ▄▄▄▄▄▄▄▄▄▄▄▛▀▙██▄███▄▄███▜ ║─────────▗▛▀▀▀▀▀▀▀▀▀▀▀█▀▐ ║──■─■─■──────▝███▄█▌──▀█▐ ║──█─█─█───────▝▀▀─▝█────▀ ╚══▀═▀═▀════════════▀▘═══╝\",\n [\"1tap\"] = \"╔════════════════════════╗ ║░░█░░███░░███░░███░░█░█░║ ║░██░░░█░░░█░█░░█░█░█░█░█║ ║░░█░░░█░░░███░░███░░█░█░║ ║░███░░█░░░█░█░░█░░░░░█░░║ ╚════════════════════════╝\",\n [\"ff\"] = \"────────────────────────── ──────────██████────────── ──▐──────██▀██▀██──────▌── ─▐▐▐────█▄▄████▄▄█────▌▌▌─ ▐▐▐▐───▐█░■░██░■░█▌───▌▌▌▌ ▐███─▄▌▐█░░░██░░░█▌▐▄─███▌ ▐████▀─▐██████████▌─▀████▌ ▐███───▐██████████▌───███▌ ─███───▐████──████▌───███─ ────────████──████──────── ─────────████████───────── ──────────▀▀▀▀▀▀────────── ──────────────────────────\",\n [\"nice\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░█▄░█░▀█▀░█▀▀░█▀▀░█░░░░ ░░░░█░▀█░░█░░█░░░█▀▀░▀░░░░ ░░░░▀░░▀░▀▀▀░▀▀▀░▀▀▀░▀░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░\",\n [\"ban\"] = \"░░░░░░░░░░░░░░░░░░░░░░░░░░ ▄████▄░░░░░░░░░░░░░░░░░░░░ ██████▄░░░░░░▄▄▄░░░░░░░░░░ ░███▀▀▀▄▄▄▀▀▀░░░░░░░░░░░░░ ░░░▄▀▀▀▄░░░█▀▀▄░▄▀▀▄░█▄░█░ ░░░▄▄████░░█▀▀▄░█▄▄█░█▀▄█░ ░░░░██████░█▄▄▀░█░░█░█░▀█░ ░░░░░▀▀▀▀░░░░░░░░░░░░░░░░░\",\n [\"hmm\"] = \"▒▒▒▒▒▒▒▒▒▄▄▄▄▄▄▄▄▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▄█▀▀░░░░░░▀▀█▄▒▒▒▒▒▒ ▒▒▒▒▄█▀▄██▄░░░░░░░░▀█▄▒▒▒▒ ▒▒▒█▀░▀░░▄▀░░░░▄▀▀▀▀░▀█▒▒▒ ▒▒█▀░░░░███░░░░▄█▄░░░░▀█▒▒ ▒▒█░░░░░░▀░░░░░▀█▀░░░░░█▒▒ ▒▒█░░░░░░░░░░░░░░░░░░░░█▒▒ ▒▒█░░██▄░░▀▀▀▀▄▄░░░░░░░█▒▒ ▒▒▀█░█░█░░░▄▄▄▄▄░░░░░░█▀▒▒ ▒▒▒▀█▀░▀▀▀▀░▄▄▄▀░░░░▄█▀▒▒▒ ▒▒▒▒█░░░░░░▀█░░░░░▄█▀▒▒▒▒▒ ▒▒▒▒█▄░░░░░▀█▄▄▄█▀▀▒▒▒▒▒▒▒ ▒▒▒▒▒▀▀▀▀▀▀▀▒▒▒▒▒▒▒▒▒▒▒▒▒▒\",\n [\"ok\"] = \"░░░░░░░░░░░░░░░░██████░░░░ ░███░░░░░░░░░░██▒▒▒▒▒▒███░ █▒▒▒█░░░░░░░██▒▒▒▒▒▒▒▒▒▒▒█ ░█▒▒▒█░░░░██▒▒▒▒▒▒▒▒▒▒▒▒▒█ ░░█▒▒▒█░░██▒▒██▒▒▒▒██▒▒▒▒▒ ░░░█▒▒▒█░█▒▒▒████▒▒████▒▒▒ ░█████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ █▒▒▒▒▒▒▒▒▒█▒▒▒▒█▒▒▒▒▒▒▒▒▒▒ ░█▒▒▒█████▒▒█▒▒▒▒▒▒▒▒▒██▒▒ █▒▒▒▒▒▒▒▒▒█▒███████████▒▒▒ ░█▒▒▒█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░█▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒▒▒██ ░░░███████░░█▒▒▒▒▒▒▒▒▒███░\",\n };\n }\n}\n"}}, "App/AIConstants.cs": {"9f5ab127964da24fed77dc3fe836249af30433ce": {"t": 1785745813.7703352, "n": 6031, "h": "8f10841063cfd68d", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing RestSharp.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Schema;\n\nnamespace ValSharp_Demo\n{\n internal static class AIConstants\n {\n public static readonly string DEEPSEEK_API_KEY = File.ReadAllText(\"api-key.txt\");\n\n public static readonly JsonSerializerOptions options = JsonSerializerOptions.Default;\n public static readonly JsonSchemaExporterOptions exporterOptions = new()\n {\n TreatNullObliviousAsNonNullable = true,\n };\n\n public static ChatRequest OSMANLI()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Osmanlı Teşrifat Nazırısın. \n GÖREV: Kullanıcının mesajını ağır, ağdalı ve komik bir devlet diliyle yeniden yaz.\n \n SÖZLÜKÇE (Bu terimleri mutlaka kullan):\n - Spike: Cihaz-ı İnfilak veya Zemberek\n - AFK: Gaybubet eyleyen nefer veya Firari\n - Kill/Leş: Telef veya İmha\n - Site (A/B): Mevzi veya Mahal-i Harp\n - Rush: Taarruz-ı Şedit\n - Eco: İktisat devresi\n - Ulti: Hamle-i Azami\n - Wall (Duvar): Sedd-i Metin\n - Pusu: Mevzi-i Hafî\n\n KESİN KURALLAR:\n 1. 'Nazır olarak derim ki' gibi kendini tanıtan girişler asla yapma.\n 2. Kullanıcı ne yazdıysa sadece onu resmi bir askeri rapor gibi süsle. \n 3. Öğüt verme, sadece durumu Osmanlıca ifade et.\n 4. Noktalama işareti ve tırnak kullanma. \n 5. Maksimum 400 karakter.\n 6. Hakaret, kötü söz aşağılama içerse bile eski kelime karşılıklarını kullanarak çeviri yap\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest YAPISTIR()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Valorant chati için zeki ve iğneleyici bir laf sokma ustasısın. \nGÖREV: Karşıdan gelen mesaja karşı tarafı zekanla ezecek, ince ve 'toxic' bir karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür yasaktır; sadece zeka dolu aşağılamalar ve iğnelemeler kullan.\n2. Merhaba gibi girişler yapma, doğrudan lafı yapıştır.\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Maksimum 400 karakter\n5. Kibar olma. Sizli bizli konuşma net ol\n6. Konuşma türkçesi ile konuş yazma türkçesi değil\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest SOR()\n {\n var tools = new List<Tool>();\n\n foreach (MethodInfo method in typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance))\n {\n if (method.ReturnType != typeof(string))\n continue;\n\n var @params = method.GetParameters();\n var descriptionAttribute = method.GetCustomAttribute<System.ComponentModel.DescriptionAttribute>();\n\n if (descriptionAttribute is null)\n continue;\n\n if (@params.Length > 1)\n continue;\n\n var requestFunction = new RequestFunction\n {\n Name = method.Name,\n Description = descriptionAttribute.Description,\n };\n\n if (@params.Length == 1)\n {\n requestFunction.Parameters = options.GetJsonSchemaAsNode(@params[0].ParameterType, exporterOptions);\n }\n\n tools.Add(new Tool { Function = requestFunction });\n }\n\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n MaxTokens = 250,\n Tools = tools,\n Messages = new List<Message>()\n {\nMessage.NewSystemMessage(@\"Sen Valorant chati için tasarlanmış zeki bir soru cevaplayıcısısın. \nSoruları cevaplarken sana sağlanan araçları kullanabilirsin. Gerekiyorsa birden fazla aracı/fonksiyonu aynı anda (paralel) çağır. Bir sonraki adımı atmak için önceki fonksiyonun sonucuna ihtiyacın yoksa bekleme\nOyuncu, Silah, Desen, Ajan adı isteyen araçlara tam vermek zorunda değilsin arama algoritmaları mevcut.\nOyuncunun adını bilmiyorsan oynadığı ajanın adını da verebilirsin araçlara\nSoruyu soran takımımdan gibi bir şey derse partisi(grubu) değil oyun için takımını kastediyordur takım numarasına bak party aracını kullanma\nOyuncunun adı yerine (Q) verme oyuncu adı veremiyorsan takım numarası ve ajan adı ver örnek: 1.SOVA gibi.Oyuncu adı isteyen her yere ajan adı da verebilirsin\nSkinler ile ilgili bir şey veriyorken sadece skin adı vermenin yeteceği yerde nadirlik ekleme\nAdının başında (Q) olan soruyu sorandır ve takım idleri de bu kişiye göre olur. Kişi ile aynı takım ise 1. karşı takım ise 2. olur\nDesenlerin adlarının başlarında [] içinde nadirlik seviyeleri ve seviye adları yazar\nGÖREV: Karşıdan gelen soruya doğru bilgiler ile karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür kullanma. Konu hakaret ve küfür içeriği içeriyorsa cevap vermek yerine 'Bu soruya cevap veremem' de\n2. Merhaba gibi girişler yapma, doğrudan cevabı ver\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Cevabı olabildiğince kısa tut uzatma, maksimum 400 karakteri geçme\n5. Cevaplarını TÜRKÇE dilinde ver\n6. Cevabını bilmediğin sourları bilmiyorum de bir şeyler uydurma\n8. Göremediğin ve ya gizli olan şeyler için özellikle istenmedikçe 'gizli olduğu için ulaşamıyorum' tarzı açıklamalar yapma\")\n }\n };\n\n return chatRequest;\n }\n }\n}\n"}, "ab809c9021ac2d1c145d7908e1a359ebf95d6932": {"t": 1785756591.3991776, "n": 6031, "h": "8f10841063cfd68d", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing RestSharp.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Schema;\n\nnamespace ValSharp_Demo\n{\n internal static class AIConstants\n {\n public static readonly string DEEPSEEK_API_KEY = File.ReadAllText(\"api-key.txt\");\n\n public static readonly JsonSerializerOptions options = JsonSerializerOptions.Default;\n public static readonly JsonSchemaExporterOptions exporterOptions = new()\n {\n TreatNullObliviousAsNonNullable = true,\n };\n\n public static ChatRequest OSMANLI()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Osmanlı Teşrifat Nazırısın. \n GÖREV: Kullanıcının mesajını ağır, ağdalı ve komik bir devlet diliyle yeniden yaz.\n \n SÖZLÜKÇE (Bu terimleri mutlaka kullan):\n - Spike: Cihaz-ı İnfilak veya Zemberek\n - AFK: Gaybubet eyleyen nefer veya Firari\n - Kill/Leş: Telef veya İmha\n - Site (A/B): Mevzi veya Mahal-i Harp\n - Rush: Taarruz-ı Şedit\n - Eco: İktisat devresi\n - Ulti: Hamle-i Azami\n - Wall (Duvar): Sedd-i Metin\n - Pusu: Mevzi-i Hafî\n\n KESİN KURALLAR:\n 1. 'Nazır olarak derim ki' gibi kendini tanıtan girişler asla yapma.\n 2. Kullanıcı ne yazdıysa sadece onu resmi bir askeri rapor gibi süsle. \n 3. Öğüt verme, sadece durumu Osmanlıca ifade et.\n 4. Noktalama işareti ve tırnak kullanma. \n 5. Maksimum 400 karakter.\n 6. Hakaret, kötü söz aşağılama içerse bile eski kelime karşılıklarını kullanarak çeviri yap\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest YAPISTIR()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Valorant chati için zeki ve iğneleyici bir laf sokma ustasısın. \nGÖREV: Karşıdan gelen mesaja karşı tarafı zekanla ezecek, ince ve 'toxic' bir karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür yasaktır; sadece zeka dolu aşağılamalar ve iğnelemeler kullan.\n2. Merhaba gibi girişler yapma, doğrudan lafı yapıştır.\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Maksimum 400 karakter\n5. Kibar olma. Sizli bizli konuşma net ol\n6. Konuşma türkçesi ile konuş yazma türkçesi değil\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest SOR()\n {\n var tools = new List<Tool>();\n\n foreach (MethodInfo method in typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance))\n {\n if (method.ReturnType != typeof(string))\n continue;\n\n var @params = method.GetParameters();\n var descriptionAttribute = method.GetCustomAttribute<System.ComponentModel.DescriptionAttribute>();\n\n if (descriptionAttribute is null)\n continue;\n\n if (@params.Length > 1)\n continue;\n\n var requestFunction = new RequestFunction\n {\n Name = method.Name,\n Description = descriptionAttribute.Description,\n };\n\n if (@params.Length == 1)\n {\n requestFunction.Parameters = options.GetJsonSchemaAsNode(@params[0].ParameterType, exporterOptions);\n }\n\n tools.Add(new Tool { Function = requestFunction });\n }\n\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n MaxTokens = 250,\n Tools = tools,\n Messages = new List<Message>()\n {\nMessage.NewSystemMessage(@\"Sen Valorant chati için tasarlanmış zeki bir soru cevaplayıcısısın. \nSoruları cevaplarken sana sağlanan araçları kullanabilirsin. Gerekiyorsa birden fazla aracı/fonksiyonu aynı anda (paralel) çağır. Bir sonraki adımı atmak için önceki fonksiyonun sonucuna ihtiyacın yoksa bekleme\nOyuncu, Silah, Desen, Ajan adı isteyen araçlara tam vermek zorunda değilsin arama algoritmaları mevcut.\nOyuncunun adını bilmiyorsan oynadığı ajanın adını da verebilirsin araçlara\nSoruyu soran takımımdan gibi bir şey derse partisi(grubu) değil oyun için takımını kastediyordur takım numarasına bak party aracını kullanma\nOyuncunun adı yerine (Q) verme oyuncu adı veremiyorsan takım numarası ve ajan adı ver örnek: 1.SOVA gibi.Oyuncu adı isteyen her yere ajan adı da verebilirsin\nSkinler ile ilgili bir şey veriyorken sadece skin adı vermenin yeteceği yerde nadirlik ekleme\nAdının başında (Q) olan soruyu sorandır ve takım idleri de bu kişiye göre olur. Kişi ile aynı takım ise 1. karşı takım ise 2. olur\nDesenlerin adlarının başlarında [] içinde nadirlik seviyeleri ve seviye adları yazar\nGÖREV: Karşıdan gelen soruya doğru bilgiler ile karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür kullanma. Konu hakaret ve küfür içeriği içeriyorsa cevap vermek yerine 'Bu soruya cevap veremem' de\n2. Merhaba gibi girişler yapma, doğrudan cevabı ver\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Cevabı olabildiğince kısa tut uzatma, maksimum 400 karakteri geçme\n5. Cevaplarını TÜRKÇE dilinde ver\n6. Cevabını bilmediğin sourları bilmiyorum de bir şeyler uydurma\n8. Göremediğin ve ya gizli olan şeyler için özellikle istenmedikçe 'gizli olduğu için ulaşamıyorum' tarzı açıklamalar yapma\")\n }\n };\n\n return chatRequest;\n }\n }\n}\n"}, "be51af262017437e4bfeeee61a89c546281bcbdc": {"t": 1785756592.6629417, "n": 5493, "h": "eb847710df0fa23d", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing RestSharp.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Schema;\n\nnamespace ValSharp_Demo\n{\n internal static class AIConstants\n {\n public static readonly string DEEPSEEK_API_KEY = File.ReadAllText(\"api-key.txt\");\n\n public static readonly JsonSerializerOptions options = JsonSerializerOptions.Default;\n public static readonly JsonSchemaExporterOptions exporterOptions = new()\n {\n TreatNullObliviousAsNonNullable = true,\n };\n\n public static ChatRequest OSMANLI()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Osmanlı Teşrifat Nazırısın. \n GÖREV: Kullanıcının mesajını ağır, ağdalı ve komik bir devlet diliyle yeniden yaz.\n \n SÖZLÜKÇE (Bu terimleri mutlaka kullan):\n - Spike: Cihaz-ı İnfilak veya Zemberek\n - AFK: Gaybubet eyleyen nefer veya Firari\n - Kill/Leş: Telef veya İmha\n - Site (A/B): Mevzi veya Mahal-i Harp\n - Rush: Taarruz-ı Şedit\n - Eco: İktisat devresi\n - Ulti: Hamle-i Azami\n - Wall (Duvar): Sedd-i Metin\n - Pusu: Mevzi-i Hafî\n\n KESİN KURALLAR:\n 1. 'Nazır olarak derim ki' gibi kendini tanıtan girişler asla yapma.\n 2. Kullanıcı ne yazdıysa sadece onu resmi bir askeri rapor gibi süsle. \n 3. Öğüt verme, sadece durumu Osmanlıca ifade et.\n 4. Noktalama işareti ve tırnak kullanma. \n 5. Maksimum 400 karakter.\n 6. Hakaret, kötü söz aşağılama içerse bile eski kelime karşılıklarını kullanarak çeviri yap\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest YAPISTIR()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Valorant chati için zeki ve iğneleyici bir laf sokma ustasısın. \nGÖREV: Karşıdan gelen mesaja karşı tarafı zekanla ezecek, ince ve 'toxic' bir karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür yasaktır; sadece zeka dolu aşağılamalar ve iğnelemeler kullan.\n2. Merhaba gibi girişler yapma, doğrudan lafı yapıştır.\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Maksimum 400 karakter\n5. Kibar olma. Sizli bizli konuşma net ol\n6. Konuşma türkçesi ile konuş yazma türkçesi değil\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest SOR()\n {\n var tools = new List<Tool>();\n\n foreach (MethodInfo method in typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance))\n {\n if (method.ReturnType != typeof(string))\n continue;\n\n var @params = method.GetParameters();\n var descriptionAttribute = method.GetCustomAttribute<System.ComponentModel.DescriptionAttribute>();\n\n if (descriptionAttribute is null)\n continue;\n\n if (@params.Length > 1)\n continue;\n\n var requestFunction = new RequestFunction\n {\n Name = method.Name,\n Description = descriptionAttribute.Description,\n };\n\n if (@params.Length == 1)\n {\n requestFunction.Parameters = options.GetJsonSchemaAsNode(@params[0].ParameterType, exporterOptions);\n }\n\n tools.Add(new Tool { Function = requestFunction });\n }\n\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n MaxTokens = 250,\n Tools = tools,\n Messages = new List<Message>()\n {\nMessage.NewSystemMessage(@\"Sen Valorant chati için tasarlanmış zeki bir soru cevaplayıcısısın. \nSoruları cevaplarken sana sağlanan araçları kullanabilirsin. Aynı anda birden fazla araç ve aynı aracı birden fazla kere de kullanabilirsin.\nOyuncu, Silah, Desen, Ajan adı isteyen araçlara tam vermek zorunda değilsin arama algoritmaları mevcut.\nAdının başında (Q) olan soruyu sorandır ve takım idleri de bu kişiye göre olur. Kişi ile aynı takım ise 1. karşı takım ise 2. olur\nDesenlerin adlarının başlarında [] içinde nadirlik seviyeleri ve seviye adları yazar\nGÖREV: Karşıdan gelen soruya doğru bilgiler ile karşılık ver.\nKESİN KURALLAR:\n1. Hakaret ve küfür kullanma. Konu hakaret ve küfür içeriği içeriyorsa cevap vermek yerine 'Bu soruya cevap veremem' de\n2. Merhaba gibi girişler yapma, doğrudan cevabı ver\n3. Noktalama işareti ve tırnak asla kullanma. \n4. Cevabı olabildiğince kısa tut uzatma, maksimum 400 karakteri geçme\n5. Cevaplarını TÜRKÇE dilinde ver\n6. Cevabını bilmediğin sourları bilmiyorum de bir şeyler uydurma\n8. Göremediğin ve ya gizli olan şeyler için özellikle istenmedikçe 'gizli olduğu için ulaşamıyorum' tarzı açıklamalar yapma\")\n }\n };\n\n return chatRequest;\n }\n }\n}\n"}, "e22cfd10112fc3aecb63f6db22b38d24ae2e10fd": {"t": 1785756594.0087693, "n": 5398, "h": "357572a0abfc0c3a", "c": "using DeepSeek.Core;\nusing DeepSeek.Core.Models;\nusing RestSharp.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.Json;\nusing System.Text.Json.Schema;\n\nnamespace ValSharp_Demo\n{\n internal static class AIConstants\n {\n public static readonly string DEEPSEEK_API_KEY = File.ReadAllText(\"api-key.txt\");\n\n public static readonly JsonSerializerOptions options = JsonSerializerOptions.Default;\n public static readonly JsonSchemaExporterOptions exporterOptions = new()\n {\n TreatNullObliviousAsNonNullable = true,\n };\n\n public static ChatRequest OSMANLI()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Osmanlı Teşrifat Nazırısın. \n GÖREV: Kullanıcının mesajını ağır, ağdalı ve komik bir devlet diliyle yeniden yaz.\n \n SÖZLÜKÇE (Bu terimleri mutlaka kullan):\n - Spike: Cihaz-ı İnfilak veya Zemberek\n - AFK: Gaybubet eyleyen nefer veya Firari\n - Kill/Leş: Telef veya İmha\n - Site (A/B): Mevzi veya Mahal-i Harp\n - Rush: Taarruz-ı Şedit\n - Eco: İktisat devresi\n - Ulti: Hamle-i Azami\n - Wall (Duvar): Sedd-i Metin\n - Pusu: Mevzi-i Hafî\n\n KESİN KURALLAR:\n 1. 'Nazır olarak derim ki' gibi kendini tanıtan girişler asla yapma.\n 2. Kullanıcı ne yazdıysa sadece onu resmi bir askeri rapor gibi süsle. \n 3. Öğüt verme, sadece durumu Osmanlıca ifade et.\n 4. Noktalama işareti ve tırnak kullanma. \n 5. Maksimum 400 karakter.\n 6. Hakaret, kötü söz aşağılama içerse bile eski kelime karşılıklarını kullanarak çeviri yap\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest YAPISTIR()\n {\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n Temperature = 1f,\n MaxTokens = 75,\n Messages = new List<Message>\n {\n Message.NewSystemMessage(@\"Sen Valorant chati için zeki ve iğneleyici bir laf sokma ustasısın. \n GÖREV: Karşıdan gelen mesaja karşı tarafı zekanla ezecek, ince ve 'toxic' bir karşılık ver.\n Soruyu soran kişiyi tüm oyuncular aracını kullanarak kim olduğunu bulabilirsin. Adının başında (Q) olur ve takım idleri de bu kişiye göre olur. Kişi ile aynı takım ise 1. karşı takım ise 2. olur\n Desenlerin adlarının başlarında [] içinde nadirlik seviyeleri ve seviye adları yazıyor\nKESİN KURALLAR:\n 1. Hakaret ve küfür yasaktır; sadece zeka dolu aşağılamalar ve iğnelemeler kullan.\n 2. Merhaba gibi girişler yapma, doğrudan lafı yapıştır.\n 3. Noktalama işareti ve tırnak asla kullanma. \n 4. Maksimum 400 karakter\n 5. Kibar olma. Sizli bizli konuşma net ol\n 6. Konuşma türkçesi ile konuş yazma türkçesi değil\")\n }\n };\n\n return chatRequest;\n }\n\n public static ChatRequest SOR()\n {\n var tools = new List<Tool>();\n\n foreach (MethodInfo method in typeof(AIFunctions).GetMethods(BindingFlags.Public | BindingFlags.Instance))\n {\n if (method.ReturnType != typeof(string))\n continue;\n\n var @params = method.GetParameters();\n var descriptionAttribute = method.GetCustomAttribute<System.ComponentModel.DescriptionAttribute>();\n\n if (descriptionAttribute is null)\n continue;\n\n if (@params.Length > 1)\n continue;\n\n var requestFunction = new RequestFunction\n {\n Name = method.Name,\n Description = descriptionAttribute.Description,\n };\n\n if (@params.Length == 1)\n {\n requestFunction.Parameters = options.GetJsonSchemaAsNode(@params[0].ParameterType, exporterOptions);\n }\n\n tools.Add(new Tool { Function = requestFunction });\n }\n\n var chatRequest = new ChatRequest\n {\n Model = DeepSeekModels.ChatModel,\n MaxTokens = 250,\n Tools = tools,\n Messages = new List<Message>()\n {\nMessage.NewSystemMessage(@\"Sen Valorant chati için tasarlanmış zeki bir soru cevaplayıcısısın. \nSoruları cevaplarken sana sağlanan araçları kullanabilirsin.\n GÖREV: Karşıdan gelen soruya doğru bilgiler ile karşılık ver. \n KESİN KURALLAR:\n 1. Hakaret ve küfür kullanma. Konu hakaret ve küfür içeriği içeriyorsa cevap vermek yerine 'Bu soruya cevap veremem' de\n 2. Merhaba gibi girişler yapma, doğrudan cevabı ver\n 3. Noktalama işareti ve tırnak asla kullanma. \n 4. Cevabı olabildiğince kısa tut uzatma, maksimum 400 karakteri geçme\n 5. Cevaplarını TÜRKÇE dilinde ver\n 6. Cevabını bilmediğin sourları bilmiyorum de bir şeyler uydurma\n 8. Göremediğin ve ya gizli olan şeyler için özellikle istenmedikçe 'gizli olduğu için ulaşamıyorum' tarzı açıklamalar yapma\")\n }\n };\n\n return chatRequest;\n }\n }\n}\n"}}}}