Keeps the repo root clean - only README.md visible on landing page. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
172 lines
4.8 KiB
C#
172 lines
4.8 KiB
C#
// DeepL Auto-Translator für Habbo
|
|
// Übersetzt alle ausgehenden deutschen Nachrichten automatisch ins Englische
|
|
//
|
|
// SETUP: Hole deinen kostenlosen DeepL API Key von https://www.deepl.com/pro-api
|
|
// Kostenlos bis 500.000 Zeichen pro Monat!
|
|
|
|
using System;
|
|
using System.Net.Http;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using System.Text;
|
|
using System.Linq;
|
|
|
|
// ===== KONFIGURATION =====
|
|
var apiKey = "8ce0286b-0eb3-468f-88b3-53f244cc4f3b:fx"; // DeepL API Key hier eintragen
|
|
var sourceLang = "DE"; // Quellsprache (DE = Deutsch)
|
|
var targetLang = "EN"; // Zielsprache (EN = Englisch)
|
|
var showOriginal = true; // Original im Log anzeigen?
|
|
var minLength = 2; // Mindestlänge für Übersetzung
|
|
// =========================
|
|
|
|
var httpClient = new HttpClient();
|
|
var isProcessing = false;
|
|
|
|
// DeepL API Endpunkt (kostenlose Version)
|
|
var deeplUrl = "https://api-free.deepl.com/v2/translate";
|
|
// Für Pro Version stattdessen: "https://api.deepl.com/v2/translate"
|
|
|
|
async Task<string> TranslateText(string text)
|
|
{
|
|
try
|
|
{
|
|
var content = new FormUrlEncodedContent(new[]
|
|
{
|
|
new KeyValuePair<string, string>("auth_key", apiKey),
|
|
new KeyValuePair<string, string>("text", text),
|
|
new KeyValuePair<string, string>("source_lang", sourceLang),
|
|
new KeyValuePair<string, string>("target_lang", targetLang)
|
|
});
|
|
|
|
var response = await httpClient.PostAsync(deeplUrl, content);
|
|
var responseString = await response.Content.ReadAsStringAsync();
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
Log($"DeepL Error: {response.StatusCode} - {responseString}");
|
|
return null;
|
|
}
|
|
|
|
var json = JsonSerializer.Deserialize<JsonElement>(responseString);
|
|
|
|
if (json.TryGetProperty("translations", out var translations) &&
|
|
translations.GetArrayLength() > 0)
|
|
{
|
|
var translated = translations[0].GetProperty("text").GetString();
|
|
return translated;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log($"Translation Error: {ex.Message}");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Chat Nachrichten abfangen (Talk)
|
|
OnIntercept(Out["Chat"], async e =>
|
|
{
|
|
if (isProcessing) return;
|
|
|
|
var message = e.Packet.ReadString();
|
|
var bubble = e.Packet.ReadInt();
|
|
var trackingId = e.Packet.ReadInt();
|
|
|
|
// Kurze Nachrichten oder Befehle ignorieren
|
|
if (message.Length < minLength || message.StartsWith(":") || message.StartsWith("/"))
|
|
return;
|
|
|
|
e.Block();
|
|
isProcessing = true;
|
|
|
|
if (showOriginal) Log($"Original: {message}");
|
|
|
|
var translated = await TranslateText(message);
|
|
|
|
if (!string.IsNullOrEmpty(translated) && translated != message)
|
|
{
|
|
Log($"Translated: {translated}");
|
|
Send(Out["Chat"], translated, bubble, trackingId);
|
|
}
|
|
else
|
|
{
|
|
// Bei Fehler Original senden
|
|
Send(Out["Chat"], message, bubble, trackingId);
|
|
}
|
|
|
|
isProcessing = false;
|
|
});
|
|
|
|
// Shout Nachrichten abfangen
|
|
OnIntercept(Out["Shout"], async e =>
|
|
{
|
|
if (isProcessing) return;
|
|
|
|
var message = e.Packet.ReadString();
|
|
var bubble = e.Packet.ReadInt();
|
|
|
|
if (message.Length < minLength || message.StartsWith(":") || message.StartsWith("/"))
|
|
return;
|
|
|
|
e.Block();
|
|
isProcessing = true;
|
|
|
|
if (showOriginal) Log($"Original (Shout): {message}");
|
|
|
|
var translated = await TranslateText(message);
|
|
|
|
if (!string.IsNullOrEmpty(translated) && translated != message)
|
|
{
|
|
Log($"Translated: {translated}");
|
|
Send(Out["Shout"], translated, bubble);
|
|
}
|
|
else
|
|
{
|
|
Send(Out["Shout"], message, bubble);
|
|
}
|
|
|
|
isProcessing = false;
|
|
});
|
|
|
|
// Whisper Nachrichten abfangen
|
|
OnIntercept(Out["Whisper"], async e =>
|
|
{
|
|
if (isProcessing) return;
|
|
|
|
var target = e.Packet.ReadString();
|
|
var message = e.Packet.ReadString();
|
|
var bubble = e.Packet.ReadInt();
|
|
|
|
if (message.Length < minLength || message.StartsWith(":") || message.StartsWith("/"))
|
|
return;
|
|
|
|
e.Block();
|
|
isProcessing = true;
|
|
|
|
if (showOriginal) Log($"Original (Whisper to {target}): {message}");
|
|
|
|
var translated = await TranslateText(message);
|
|
|
|
if (!string.IsNullOrEmpty(translated) && translated != message)
|
|
{
|
|
Log($"Translated: {translated}");
|
|
Send(Out["Whisper"], target, translated, bubble);
|
|
}
|
|
else
|
|
{
|
|
Send(Out["Whisper"], target, message, bubble);
|
|
}
|
|
|
|
isProcessing = false;
|
|
});
|
|
|
|
Log("=================================");
|
|
Log("DeepL Translator aktiviert!");
|
|
Log($"Übersetzt: {sourceLang} -> {targetLang}");
|
|
Log("Befehle mit : oder / werden ignoriert");
|
|
Log("=================================");
|
|
|
|
Wait();
|