Showing preview only (301K chars total). Download the full file or copy to clipboard to get everything.
Repository: OsuSync/Sync
Branch: master
Commit: b15f75d3e356
Files: 125
Total size: 264.5 KB
Directory structure:
gitextract_0_roh6il/
├── .gitignore
├── .gitmodules
├── LICENSE
├── Language/
│ ├── de-DE/
│ │ ├── BanManagerPlugin.DefaultLanguage.lang
│ │ ├── BeatmapSuggest.DefaultLanguage.lang
│ │ ├── ConfigGUI.DefaultLanguage.lang
│ │ ├── DefaultGUI.Language.lang
│ │ ├── DefaultPlugin.Language.lang
│ │ ├── NowPlaying.Languages.lang
│ │ ├── OsuRTDataProvider.DefaultLanguage.lang
│ │ ├── RealTimePPDisplayer.DefaultLanguage.lang
│ │ ├── RecentlyUserQuery.DefaultLanguage.lang
│ │ └── Sync.Tools.DefaultI18n.lang
│ ├── en-US/
│ │ ├── BanManagerPlugin.DefaultLanguage.lang
│ │ ├── BeatmapSuggest.DefaultLanguage.lang
│ │ ├── ConfigGUI.DefaultLanguage.lang
│ │ ├── DefaultGUI.Language.lang
│ │ ├── DefaultPlugin.Language.lang
│ │ ├── NowPlaying.Languages.lang
│ │ ├── OsuRTDataProvider.DefaultLanguage.lang
│ │ ├── RealTimePPDisplayer.DefaultLanguage.lang
│ │ ├── RecentlyUserQuery.DefaultLanguage.lang
│ │ └── Sync.Tools.DefaultI18n.lang
│ ├── hu-HU/
│ │ ├── BanManagerPlugin.DefaultLanguage.lang
│ │ ├── DefaultGUI.Language.lang
│ │ ├── DefaultPlugin.Language.lang
│ │ ├── NowPlaying.Languages.lang
│ │ ├── OsuRTDataProvider.DefaultLanguage.lang
│ │ ├── RealTimePPDisplayer.DefaultLanguage.lang
│ │ ├── RecentlyUserQuery.DefaultLanguage.lang
│ │ └── Sync.Tools.DefaultI18n.lang
│ ├── ja-JP/
│ │ ├── BanManagerPlugin.DefaultLanguage.lang
│ │ ├── BeatmapSuggest.DefaultLanguage.lang
│ │ ├── ConfigGUI.DefaultLanguage.lang
│ │ ├── DefaultGUI.Language.lang
│ │ ├── DefaultPlugin.Language.lang
│ │ ├── NowPlaying.Languages.lang
│ │ ├── OsuRTDataProvider.DefaultLanguage.lang
│ │ ├── RealTimePPDisplayer.DefaultLanguage.lang
│ │ ├── RecentlyUserQuery.DefaultLanguage.lang
│ │ └── Sync.Tools.DefaultI18n.lang
│ ├── ru-RU/
│ │ ├── BanManagerPlugin.DefaultLanguage.lang
│ │ ├── BeatmapSuggest.DefaultLanguage.lang
│ │ ├── ConfigGUI.DefaultLanguage.lang
│ │ ├── DefaultGUI.Language.lang
│ │ ├── DefaultPlugin.Language.lang
│ │ ├── NowPlaying.Languages.lang
│ │ ├── OsuRTDataProvider.DefaultLanguage.lang
│ │ ├── RealTimePPDisplayer.DefaultLanguage.lang
│ │ ├── RecentlyUserQuery.DefaultLanguage.lang
│ │ └── Sync.Tools.DefaultI18n.lang
│ └── zh-CN/
│ ├── BanManagerPlugin.DefaultLanguage.lang
│ ├── ConfigGUI.DefaultLanguage.lang
│ ├── DefaultGUI.Language.lang
│ ├── DefaultPlugin.Language.lang
│ ├── NowPlaying.Languages.lang
│ ├── RecentlyUserQuery.DefaultLanguage.lang
│ └── Sync.Tools.DefaultI18n.lang
├── README.md
├── Sync/
│ ├── Client/
│ │ ├── ClientEvent.cs
│ │ ├── ClientManager.cs
│ │ ├── ClientWorkWrapper.cs
│ │ └── DefaultReciveClient.cs
│ ├── Command/
│ │ ├── CommandDispatch.cs
│ │ └── CommandManager.cs
│ ├── Dependence/
│ │ └── config.ini
│ ├── Event/
│ │ └── EventDispatcher.cs
│ ├── MessageFilter/
│ │ ├── FilterBase.cs
│ │ ├── FilterManager.cs
│ │ ├── FilterPriorityAttribute.cs
│ │ ├── MessageDispatcher.cs
│ │ └── MessageManager.cs
│ ├── Plugins/
│ │ ├── Plugin.cs
│ │ └── PluginManager.cs
│ ├── Program.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── Settings.Designer.cs
│ │ └── Settings.settings
│ ├── Resources/
│ │ ├── App.config
│ │ └── icon.psd
│ ├── Source/
│ │ ├── SourceBase.cs
│ │ ├── SourceEvent.cs
│ │ ├── SourceManager.cs
│ │ └── SourceWorkWrapper.cs
│ ├── Sync.csproj
│ ├── SyncHost.cs
│ ├── Tools/
│ │ ├── Builtin/
│ │ │ ├── CommonCommand.cs
│ │ │ ├── InternalPlugin.cs
│ │ │ └── PluginCommand.cs
│ │ ├── CommandParser.cs
│ │ ├── Configuration.cs
│ │ ├── ConfigurationAttribute/
│ │ │ ├── BaseConfigurationAttribute.cs
│ │ │ ├── BoolAttribute.cs
│ │ │ ├── ClientAndSourceAttribute.cs
│ │ │ ├── ColorAttribute.cs
│ │ │ ├── ConfigurationHolderAttribute.cs
│ │ │ ├── FloatAttribute.cs
│ │ │ ├── FontAttribute.cs
│ │ │ ├── GuiLanguageElement.cs
│ │ │ ├── IntegerAttribute.cs
│ │ │ ├── ListAttribute.cs
│ │ │ ├── PathAttribute.cs
│ │ │ └── StringAttribute.cs
│ │ ├── ConfigurationIO.cs
│ │ ├── I18n.cs
│ │ ├── IConfigurable.cs
│ │ ├── PluginConfiuration.cs
│ │ ├── SentryHelper.cs
│ │ ├── StartupArgument.cs
│ │ ├── StartupHelper.cs
│ │ ├── StringElement.cs
│ │ ├── SyncIO/
│ │ │ ├── ConsoleWriter.cs
│ │ │ ├── FileLoggerWriter.cs
│ │ │ ├── IOWrapper.cs
│ │ │ ├── Logger.cs
│ │ │ └── NConsoleWriter.cs
│ │ ├── Updater.cs
│ │ └── Utils/
│ │ ├── ConfigurationHelper.cs
│ │ └── PluginsHelper.cs
│ ├── app.config
│ ├── config.ini
│ └── packages.config
└── Sync.sln
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
!packages/*/build/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
*.json
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
*.pubxml
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
# =========================
# Windows detritus
# =========================
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
.vs/
.vscode/
ReadMe/
packages/
/output
/Sync/bin*
================================================
FILE: .gitmodules
================================================
[submodule "OfficalPlugins"]
path = OfficalPlugins
url = https://github.com/Deliay/SyncPlugin.git
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017-2018 OsuSync
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Language/de-DE/BanManagerPlugin.DefaultLanguage.lang
================================================
[de-DE]
LANG_HELP_BAN=Sperre Benutzer/ID/Regex ,Nachrichten werden über IRC versendet.
LANG_HELP_UNBAN=Entsperre Benutzer/ID/Regex.
LANG_HELP_WHITELIST=Füge Benutzer/ID/Regex zur Whitelist hinzu, um das versenden von Nachrichten über IRC zu ermöglichen.
LANG_HELP_REMOVE_WHITELIST=Entferne Benutzer/ID/Regex aus der Whitelist.
LANG_HELP_ACCESS=Setze Berechtigungen zum Versenden von Nachrichten über IRC.
LANG_HELP_LIST=Liste die Whitelist oder die Sperrliste auf.
LANG_ERR_COMMAND=Befehlsfehler.
================================================
FILE: Language/de-DE/BeatmapSuggest.DefaultLanguage.lang
================================================
[de-DE]
LANG_GET_BEATMAP_FAILED=Erhalten von Beatmap Metadaten {0} schlug fehl,Fehlermeldung: {1}.
LANG_SUGGEST_MEG={0} fordert dich auf, folgende Beatmap zu spielen [{1} {2}] || [{3} herunterladen] || [{4} Verweis] oder werwende "?dl"/"?dl all".
LANG_NOT_FOUND_ERR=Es kann kein passender Inhalt gefunden werden oder die BeatmapSet ID ist ungültig.
LANG_UNKNOWN_TITLE=<Unbekannter Titel>
LANG_GET_BEATMAP_TIME_OUT=Zeitüberschreitung beim erhalten des Beatmap Titel {0}, Aufgabenstatus{1}.
LANG_INVAILD_ID=Ungültige ID {0}.
LANG_UNKOWN_PARAM=Unbekannter Parameter {0}.
LANG_ERROR_INFO_IMCOMPLETE=Unvollständige Informationen.
LANG_NO_API_KEY_NOFITY=Der osu!api Schlüssel-eintrag fehlt in der Konfigurationsdatei config.ini. Bitte vervollständige diesen mit Hilfe von https://osu.ppy.sh/p/api
LANG_START_DOWNLOAD=Der Download der Beatmap {0} hat begonnen.
LANG_FINISH_DOWNLOAD=Der Download der Beatmap {0} wurde abgeschlossen.
LANG_FAILED_DOWNLOAD=Der Downloaded der Beatmap {0} schlug fehl, Fehlermeldung: {1}.
LANG_DOWNLOAD_TASK_COUNT=Der Download von {0} Beatmaps hat begonnen.
================================================
FILE: Language/de-DE/ConfigGUI.DefaultLanguage.lang
================================================
[de-DE]
BUTTON_OPEN=Öffne
BUTTON_BROWSE=Durchsuche
BUTTON_FONT=Schriftart
BUTTON_COLOR=Farbe
WINDOW_TITLE=Konfiguration
BUTTON_SAVE=Speichere
LABEL_SAVED=Gespeichert!
LABEL_SAVED_SAVING=Speichere...
WINDOW_TITLE_REQUIRE_RESTART=Bitte starten sie neu um einige Einstellungen zu übernehmen.
================================================
FILE: Language/de-DE/DefaultGUI.Language.lang
================================================
[de-DE]
UI_DISPLAY=Öffne die UI
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS=IRC Passwort
UI_TIPS_STATUS=Status
UI_TIPS_DANMAKU=LiveID
UI_TIPS_OSU_IRC=osu!Chat
UI_TIPS_TARGET_IRC=ToIRC
UI_BOTTON_START=Start
UI_BOTTON_STOP=Stop
UI_BOTTON_LOGIN_DANMAKU=Source Login
UI_BOTTON_SWITCH_CON=Wechsel zur command-line-interface UI
UI_BOTTON_EXIT=Beende
UI_TIPS_LIVE_ID=LiveID
UI_TIPS_LIVE_SOURCE=Quelle
UI_INFO_RESTART_REQ=Um die Änderung des Livestreams zu übernehmen, muss Sync neugestartet werden. Starte jetzt neu?
================================================
FILE: Language/de-DE/DefaultPlugin.Language.lang
================================================
[de-DE]
LANG_COMMANDS_LOGIN=login Benutzername> [Passwort] um Nachrichten zur Quelle zu versenden.
LANG_COMMANDS_EXIT=Arbeiten einstellen und beenden.
LANG_COMMANDS_CLEAR=Bildschirm löschen.
LANG_COMMANDS_STATUS=Status der aktuellen Arbeit abrufen.
LANG_COMMANDS_STOP=Laufende Arbeit stoppen.
LANG_COMMANDS_START=Synchronisierung starten.
LANG_COMMANDS_HELP=Hilfemitteilung drucken.
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Eine Nachricht zum Test an die Quelle senden.
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Eine Nachricht zum Test an den Kunden senden.
LANG_COMMANDS_SOURCES=Alle Quellen-Liste erhalten oder eine Quelle setzen.
LANG_COMMANDS_MSGMGR=--help-argument ausführen, um Hilfe zu erhalten.
LANG_COMMANDS_FILTERS=Alle verfügbaren Filter auflisten.
LANG_COMMANDS_DISABLE= disable <plugin name>, um OnDisable() Funtion des Plugins aufzurufen.
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client], um uu einem bestimmten Client wechseln.
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd], um sich an der Quelle anzumelden.
LANG_COMMANDS_RESTART=Anwendung neu starten.
LANG_COMMANDS_LANG=lang [cultureName] Sprache holen/einstellen.
LANG_COMMANDS_LISTLANG=listlang [--all] Liste (unterstützte/alle) Sprachen.
LANG_COMMANDS_BILIBILI=setbili <roomID> Quelle der Bilibili RoomID setzen.
LANG_COMMANDS_FILTERS_ITEM=Item
LANG_COMMANDS_FILTERS_OBJ=Object
LANG_COMMANDS_SET_OSU_BOT=setosubot (botirc) (botirc_pw) (targetirc), um das OSUIRCBot-Konten setzen.
LANG_COMMANDS_BOTIRC_CURRENT=Aktuelles BotIRC: {0:S}.
LANG_COMMANDS_BOTIRC_SET=Aktuelles BotIRC auf {0:S} setzen.
LANG_COMMANDS_IRC_CURRENT=Aktuelles IRC Ziel: {0:S}.
LANG_COMMANDS_IRC_SET=Aktuelles IRC Ziel auf {0:S} festlegen.
LANG_COMMANDS_TARGET_CURRENT=Aktuelle LiveID: {0:S}
LANG_COMMANDS_TARGET_SET=Aktuelle LiveID setzen auf
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_AUTHOR=Autor
LANG_COMMANDS_SOURCES_NAME=Quelle
LANG_COMMANDS_SOURCES_AUTHOR=Autor
LANG_COMMANDS_CURRENT=Auf {0:S} festlegen.
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=Die aktuelle Quelle ist keine Sendable-Quelle.
LANG_COMMANDS_EXIT_DONE=Ausführung beendet, bitte schließen Sie das Fenster.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT= IRC nicht verbunden.Nachricht können nicht an den Client versendet werden.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Anmeldung zur Quelle erforderlich.
LANG_COMMANDS_START_ALREADY_RUN= Eine Instanz der Anwendung läuft bereits.
LANG_COMMANDS_ARGUMENT_WRONG=Falsches Argument.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Lower Level für weniger Nachrichten\n--option <type> :auto/force_all/force_limit.
LANG_COMMANDS_MSGMGR_LIMIT=Begrenzt...
LANG_COMMANDS_MSGMGR_FREE=Unbegrenzt
LANG_COMMANDS_MSGMGR_STATUS=MessageManager Modus:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}.
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Geschwindigkeitsbegrenzung auf {0} setzen.
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=Grenzwerttyp auf {0} setzen.
LANG_SEND_COOKIE_SAVED=Anmelde-Informationen erfolgreich gespeichert.
LANG_SEND_DONE=Nachricht gesendet.
LANG_DOUYU_FAIL=Überprüfung des Verbindungsstatus fehlgeschlagen! Außer {0}, Ergebnis {1}
LANG_DOUYU_AUTH_SUCC=Authentifizierung zu Douyutv erfolgreich.
LANG_DOUYU_DANMAKU=Erhaltene Nachricht: {0}:{1}
LANG_DOUYU_GIFT=Geschenk
LANG_BILIBILI_ONLINECHANGE=Online änderung: {0}
LANG_COMMANDS_CLIENTUSERMSG=chatuser <Benutzername> <Nachricht> IRC-Nachricht an Live mit angegebenem Benutzernamen senden
LANG_OSUIRC_LOGIN_SUCCESS=Anmeldung erfolgreich.
LANG_OSUIRC_LOGIN_FAILED=Versuch, die Verbindung zu osu!irc wiederherzustellen, fehlgeschlagen, Grund:{0}
LANG_OSUIRC_NETWORK_INTERRUPTED= Das Netzwerk ist unterbrochen, versuchen Sie nun, die Verbindung wieder herzustellen.
LANG_OSUIRC_RECIVER_FINISHED=Der Empfänger-Thread ist beendet.
================================================
FILE: Language/de-DE/NowPlaying.Languages.lang
================================================
[de-DE]
OSU_PATH_NOT_SET=osu! Pfad ist leer. Die Anwendung sucht nach einer laufenden osu! Instanz.
FIND_OSU_PATH=Kann den osu! Pfad nicht finden: {0:S}
OSU_PATH_FAIL=Kann den osu! Pfad nicht finden. Weitere Informationen versteckt.
ERROR_WHILE_FIND_PATH=Fehler bei der Suche nach dem osu! Pfad {0:S}
UNKNOWN_COMMAND=Unbekannter Befehl {0:S}
STATUS_PLAYING=Spiele
STATUS_EDITING=Bearbeite
STATUS_OTHER=Höre
STATUS_TIP_INFO=Ich bin {0:S}{1:S}
STATUS_TIP_INFO_WRAP=Ich bin {0:S}{1:S}
ERROR_WHILE_SEARCH_MAP=Fehler bei der Suche nach {0:S}-{1:S} [{2:S}] {3:S}
CONSOLE_OUTPUT_RESULT=Datei:{0:S} ({1}ms) HP/CS/AR/OD: {2}{3}{4}{5}
OUTPUT_RESULT=Aktuell {0}:{1}
CURRENT_IDLE=Aktuell im Lehrlauf
================================================
FILE: Language/de-DE/OsuRTDataProvider.DefaultLanguage.lang
================================================
[de-DE]
LANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]Kann den osu!.exe Prozess nicht finden.
LANG_OSU_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exe Prozess gefunden.
LANG_INIT_PLAY_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Initialisierung von PlayFinder schlug fehl! Wiederhole in {1} Sekunden.
LANG_INIT_PLAY_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Initialisierung von PlayFinder Success!
LANG_INIT_STATUS_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Initialisierung von StatusFinder schlug fehl! Wiederhole in {1} Sekunden.
LANG_INIT_STATUS_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Initialisierung von StatusFinder erfolgreich!
LANG_INIT_BEATMAP_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Initialisierung von BeatmapFinder schlug fehl! Wiederhole in {1} Sekunden.
LANG_INIT_BEATMAP_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Initialisierung von BeatmapFinder erfolgreich!
LANG_INIT_MODE_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Initialisierung von ModeFinder Failed! schlug fehl! Wiederhole in {1} Sekunden.
LANG_INIT_MODE_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Initialisierung von ModeFinder erfolgreich!
LANG_BEATMAP_NOT_FOUND=Beatmap nicht gefunden.
================================================
FILE: Language/de-DE/RealTimePPDisplayer.DefaultLanguage.lang
================================================
[de-DE]
UI_MENU_TOPMOST=Oberste
TEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP Datei: {0}
MMF_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]Speicherzuordnungsdatei: {0}
================================================
FILE: Language/de-DE/RecentlyUserQuery.DefaultLanguage.lang
================================================
[de-DE]
LANG_HELP=\nDies ist eine Hilfe für IRC Befehle. Hänge dazu ein "?" am Anfang der Nachrichten ein.\nrecently --status | Rufe den Status des aktuellen Protokolls ab (osu! IRC nicht verfügbar)\n recently --u <Benutzername> | Rufe <Benutzername> Protokoll ab (Nicht empfohlen für osu! IRC Verwendung)\n recently --i <BenutzerID> | Rufe <Benutzername> Protokoll ab (Nicht empfohlen für osu! IRC Verwendung)\n recently | Rufe den aktuellen Benutzernamen und die ID ab. Die ID kann verwendet für Aktionen wie "?ban --i" (osu! IRC unterstützt) verwendet werden\nrecently --disable | Nachrichtenprotokollierung deaktiviert. Alle Protokolle werden gelöscht (osu! IRC unterstützt)\recently --start | Protokollierung erneut starten (osu! IRC unterstützt)\recently --realloc <Kapazität> | Kapazität der Protokolle neu zuweisen, um mehr Protokolle zu speichern (osu! IRC unterstützt)\recently --recently | Aktuelle Benutzer-ID ermitteln.
LANG_MSG_STATUS=MessageRecord Status: {0} | recordCount/Kapazität: {1}/{2}
LANG_RUNNING=Läuft
LANG_STOP=Angehalten
LANG_MSG_DISABLE=Nachrichtenprotokollierung deaktiviert, alle Protokolle wurden gelöscht.
LANG_MSG_START=Die Nachrichtenprotokollierung wurde gestartet.
LANG_MSG_REALLOC_ERR=MessageRecord: Falsche Anweisungen.
LANG_MSG_REALLOC=Sie können jetzt den Nachrichtenverlauf für {0} protokollieren.
LANG_MSG_NOTIMPLENT=Nicht implementiert.
LANG_MSG_UNKNOWNCOMMAND=Unbekannter Befehl.
================================================
FILE: Language/de-DE/Sync.Tools.DefaultI18n.lang
================================================
[de-DE]
LANG_Loading=Lade....
LANG_Plugins={0:D} Plugins geladen.
LANG_Sources={0:D} Quellen geladen.
LANG_Client={0:D} Clients geladen.
LANG_Error=KÖNNEN WARPPER NICHT INITIALISIEREN! ÜBERPRÜFEN SIE IHRE PLUGINS.
LANG_Commands={0:D} Befehle geladen.
LANG_Filters={0:D} Filter geladen.
LANG_Ready=Fertig.
LANG_RqueireLogin=Bitte melden Sie sich an.
LANG_AccountName=Benutzername:
LANG_AccountPw=Passwort:
LANG_AccountSave=Account erfolgreich gespeichert!
LANG_Start=Starte...
LANG_Stopping=Stoppe...
LANG_Restarting=Starte neu...
LANG_LoadingPlugin=Lade {0:S} ...
LANG_LoadPluginErr=Kann {0:S} nicht laden ({1:S})
LANG_NotPluginErr={0:S} ist kein Standartplugin ({1:S})
LANG_NotConfig=Bitte nehmen sie Grundeinstellungen an der Konfiguration 'config.ini' vor.
LANG_NoSource=Kann keine Quelle für Warpper finden. Bitte installieren Sie eine Quelle.
LANG_MissSource=Ich kann die Quelle in den spezifischen Einstellungen nicht finden.
LANG_SetSource={0:S} als aktuelle Live-Quelle festlegen
LANG_SupportSend=Nach der Anmeldung können Sie eine Nachricht über die Quelle senden (Befehl: login [Benutzer] [Passwort])
LANG_CertLength=Länge des Zertifikats: {0:D}
LANG_CertExist=Aktuelles Zertifikat vorhanden, überschreiben Sie es mit dem Anmelde-Befehl.
LANG_SendNotReady=Die aktuelle Quelle ist nicht bereit, an Danmaku zu senden.
LANG_UnknowCommand=Unbekannter Befehl, geben Sie 'help' für die Befehlsliste ein.
LANG_CommandFail=Befehlsausführung fehlgeschlagen, geben Sie 'help' für die Befehlsliste ein.
LANG_ConfigFile=Einstellungen
LANG_UserCount=Änderung der Benutzeranzahl : {0:D}
LANG_UserCount_Change=Zuschauer {0:S} to {1:D}
LANG_UserCount_Change_Increase=erhöhen
LANG_UserCount_Change_Decrease=reduzieren
LANG_Source_Disconnecting=Trennen der Quellverbindung...
LANG_Source_Disconnected=Die Verbindung zum Quellserver wurde getrennt. Wiederholung nach 3 Sekunden.
LANG_Source_Disconnected_Succ=Erfolgreiche Trennung der Verbindung zum Quellserver.
LANG_Source_Connect=Verbindung zum Quellserver herstellen...
LANG_Source_Connected_Succ=Erfolg mit dem Quellenserver verbunden!
LANG_Current_Online=Aktuell online: {0:D}
LANG_Gift_Sent=Ich sende {O:D} (1 S) zu dir!
LANG_Config=Einstellungen:
LANG_Config_Status_OK=OK, LiveID:{0}
LANG_Config_Status_Fail=Konfiguration fehlgeschlagen.
LANG_Source=Quelle {0:S}:
LANG_IRC=Client:
LANG_Danmaku=Danmaku sendet:
LANG_Status_Connected=Verbunden
LANG_Status_NotConenct=Leerlauf
LANG_Loading_Config=Laden von Einstellungen...\n
LANG_Welcome=osu!Live Sync Version {0:S}
LANG_Help=Geben Sie den Befehl 'help' für Hilfe ein
LANG_Command=Befehl
LANG_Command_Description=Beschreibung
LANG_Plugin_Cycle_Reference=Das Plugin wird zyklisch referenziert. {0:S} wird ohne den abhängigen Baum nicht geladen.
LANG_IRC_Connecting=[Client] verbindend...
LANG_IRC_Disconnect=Trennen der Verbindung zum IRC-Server...
LANG_IRC_Connect_Timeout=Client-Verbindung fehlgeschlagen, bitte überprüfen Sie Ihre Internetverbindung.
LANG_IRC_Ready=[Client] ist bereit!
LANG_MsgMgr_Limit=Der Nachrichtenbegrenzer ist eingeschaltet, das Danmaku nur mit dem Präfix ?send wird an irc gesendet.
LANG_MsgMgr_Free=Der Nachrichtenbegrenzer ist ausgeschaltet.
LANG_Instance_Exist=Die Anwendung ist bereits gestarter.
LANG_COMMANDS_LOGIN=login Benutzername> [Passwort] um Nachrichten zur Quelle zu versenden.
LANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source
LANG_COMMANDS_EXIT=Arbeiten einstellen und beenden.
LANG_COMMANDS_EXIT=Stop sync and Exit
LANG_COMMANDS_CLEAR=Bildschirm löschen.
LANG_COMMANDS_CLEAR=Clear output screen
LANG_COMMANDS_STATUS=Status der aktuellen Arbeit abrufen.
LANG_COMMANDS_STATUS=Get status of current Source and Client
LANG_COMMANDS_STOP=Laufende Arbeit stoppen.
LANG_COMMANDS_STOP=Stop sync
LANG_COMMANDS_START=Synchronisierung starten.
LANG_COMMANDS_START=Start sync
LANG_COMMANDS_HELP=Hilfemitteilung drucken.
LANG_COMMANDS_HELP=Print help message
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Eine Nachricht zum Test an die Quelle senden.
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Send a message to source for test
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Eine Nachricht zum Test an den Kunden senden.
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Send a message to client for test
LANG_COMMANDS_SOURCES=Alle Quellen-Liste erhalten oder eine Quelle setzen.
LANG_COMMANDS_SOURCES=get all source list or set a source
LANG_COMMANDS_MSGMGR=--help-argument ausführen, um Hilfe zu erhalten.
LANG_COMMANDS_MSGMGR=Execute with '--help' to get help
LANG_COMMANDS_FILTERS=Alle verfügbaren Filter auflisten.
LANG_COMMANDS_FILTERS=List all available filters.
LANG_COMMANDS_DISABLE= disable <plugin name>, um OnDisable() Funtion des Plugins aufzurufen.
LANG_COMMANDS_DISABLE=disable <plugin name> Invoke Plugin OnDisable() function
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client], um uu einem bestimmten Client wechseln.
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client] Switch to specific client
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd], um sich an der Quelle anzumelden.
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd] Login to source
LANG_COMMANDS_RESTART=Anwendung neu starten.
LANG_COMMANDS_RESTART=Restart Sync
LANG_COMMANDS_LANG=lang [cultureName] Sprache holen/einstellen.
LANG_COMMANDS_LANG=lang [cultureName] Get/Set language
LANG_COMMANDS_LISTLANG=listlang [--all] Liste (unterstützte/alle) Sprachen.
LANG_COMMANDS_FILTERS_ITEM=Item
LANG_COMMANDS_FILTERS_ITEM=Item
LANG_COMMANDS_FILTERS_OBJ=Object
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_AUTHOR=Autor
LANG_COMMANDS_CLIENT_AUTHOR=Author
LANG_COMMANDS_SOURCES_NAME=Quelle
LANG_COMMANDS_SOURCES_NAME=Source
LANG_COMMANDS_SOURCES_AUTHOR=Autor
LANG_COMMANDS_SOURCES_AUTHOR=Author
LANG_COMMANDS_CURRENT=Auf {0:S} festlegen.
LANG_COMMANDS_CURRENT=Set to {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=Die aktuelle Quelle ist keine Sendable-Quelle.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT= IRC nicht verbunden.Nachricht können nicht an den Client versendet werden.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!irc not connect properly, can't send message.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Anmeldung zur Quelle erforderlich.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Require Login to source!
LANG_COMMANDS_START_ALREADY_RUN= Eine Instanz der Anwendung läuft bereits.
LANG_COMMANDS_START_ALREADY_RUN=An instance is already running
LANG_COMMANDS_ARGUMENT_WRONG=Falsches Argument.
LANG_COMMANDS_ARGUMENT_WRONG=Wrong argument.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Lower Level für weniger Nachrichten\n--option <type> :auto/force_all/force_limit.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Lower Level for less messaging\n--option <type> :Auto/ForceAll/ForceLimit/DisableAll
LANG_COMMANDS_MSGMGR_LIMIT=Begrenzt...
LANG_COMMANDS_MSGMGR_LIMIT=MessageManager is limited...
LANG_COMMANDS_MSGMGR_FREE=Unbegrenzt
LANG_COMMANDS_MSGMGR_FREE=MessageManager is freed...
LANG_COMMANDS_MSGMGR_STATUS=MessageManager Modus:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}.
LANG_COMMANDS_MSGMGR_STATUS=MessageManager mode:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Geschwindigkeitsbegrenzung auf {0} setzen.
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Set speed limit to {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=Grenzwerttyp auf {0} setzen.
LANG_COMMANDS_START_NO_SOURCE=Es muss vor dem Start eine Quelle ausgewählt.
LANG_COMMANDS_START_NO_CLIENT=Es müssen vor dem Start ein Client ausgewählt sein.
LANG_COMMANDS_CURRENT_LANG=Aktuelle Sprache: {0:S} {1:S}
LANG_COMMANDS_LANG_SWITCHED=sucSprache erfolgreich umstellen auf {1:S}({0:S})
LANG_COMMANDS_LANG_NOT_FOUND=Sprachumschaltung fehlgeschlagen! Benutze 'listlang', um alle verfügbaren Sprachen anzuzuzeigen.
LANG_UPDATE_DONE=Update durchgeführt. Neustart, um die Aktualisierung abzuschließen.
LANG_INSTALL_DONE=Installation abgeschlossen. Neustart, um die Installation abzuschließen.
LANG_PLUGIN_NOT_FOUND=Plugin {0} ist nicht vorhanden.
LANG_REMOVE_DONE=Entfernt. Neu starten, um Effekt anzuwenden.
LANG_VERSION_LATEST_OR_CANEL={0} ist aktuell oder wurde vom Benutzer abgebrochen.
LANG_UPDATE_CHECK_ERROR=Aktualisierung kann nicht geprüft werden für [{0}] : {1} : {2}
LANG_UPDATE_ERROR=Update nicht möglich: {0} : {1}
LANG_SOURCE_NOT_SUPPORT_SEND=Die Quelle {0} unterstützt das Senden von Nachrichten noch nicht.
LANG_NO_PLUGIN_SELECT=Es muss einen Plugin-Namen angeben werden.
LANG_PLUGIN_DISABLED=Deaktiviert
LANG_COMMANDS_CLIENTUSERMSG=chatuser <Benutzername> <Nachricht> Testnachricht als <Benutzername> zum IRC senden.
LANG_COMMANDS_EXIT_DONE=Aktionsausführung beenden beendet, bitte schließen Sie das Fenster.
LANG_NO_ANY_SOURCE=Es ist keine Quelle verfügbar, bitte überprüfen Sie den Plugin-Ordner oder geben Sie 'plugins install DefaultPlugin' ein, um das Plugin als Standardquellen zu installieren
================================================
FILE: Language/en-US/BanManagerPlugin.DefaultLanguage.lang
================================================
[en-US]
LANG_HELP_BAN=ban user/id/regex ,message will be sent to irc
LANG_HELP_UNBAN=unban user/id/regex
LANG_HELP_WHITELIST=add user/id/regex to whitelist who can send message to irc
LANG_HELP_REMOVE_WHITELIST=remove user/id/regex from whitelist
LANG_HELP_ACCESS=set access level for sending messages to irc
LANG_HELP_LIST=list whiltelist or banlist
LANG_ERR_COMMAND=command error
================================================
FILE: Language/en-US/BeatmapSuggest.DefaultLanguage.lang
================================================
[en-US]
LANG_GET_BEATMAP_FAILED=Get beatmap info {0} failed,message:{1}
LANG_SUGGEST_MEG={0} want you to play the beatmap [{1} {2}] || [{3} dl] || [{4} mirror] or type"?dl"/"?dl all"
LANG_NOT_FOUND_ERR=ҲƥݻidЧbeatmapSetId Can't match infomation or param ID is invaild beatmapSetId
LANG_UNKNOWN_TITLE=<unk title>
LANG_GET_BEATMAP_TIME_OUT=Get beatmap info {0} time out,TaskStatus{1}
LANG_INVAILD_ID=invaild id value {0}
LANG_UNKOWN_PARAM=unknown param {0}
LANG_ERROR_INFO_IMCOMPLETE=Incompletable infomation
LANG_NO_API_KEY_NOFITY=there is no ApiKey in config.ini,please provide your osu!api_key for using.ApiKey address:https://osu.ppy.sh/p/api
LANG_START_DOWNLOAD=Start to download beatmap:{0}
LANG_FINISH_DOWNLOAD=Beatmap downloaded {0}
LANG_FAILED_DOWNLOAD=Downloaded {0} failed,message {1}
LANG_DOWNLOAD_TASK_COUNT=Start to download {0} beatmaps.
================================================
FILE: Language/en-US/ConfigGUI.DefaultLanguage.lang
================================================
[en-us]
BUTTON_OPEN=Open
BUTTON_BROWSE=Browse
BUTTON_FONT=Font
BUTTON_COLOR=Color
WINDOW_TITLE=Config
BUTTON_SAVE=Save
LABEL_SAVED=Saved!
LABEL_SAVED_SAVING=Saving...
WINDOW_TITLE_REQUIRE_RESTART=Some settings restart to take effect
================================================
FILE: Language/en-US/DefaultGUI.Language.lang
================================================
[en-US]
UI_DISPLAY=Show UI
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS=IRC PW
UI_TIPS_STATUS=Status
UI_TIPS_DANMAKU=LiveID
UI_TIPS_OSU_IRC=osu!Chat
UI_TIPS_TARGET_IRC=ToIRC
UI_BOTTON_START=Start
UI_BOTTON_STOP=Stop
UI_BOTTON_LOGIN_DANMAKU=Source Login
UI_BOTTON_SWITCH_CON=Switch to CMD UI
UI_BOTTON_EXIT=Exit
UI_TIPS_LIVE_ID=LiveID
UI_TIPS_LIVE_SOURCE=Source
UI_INFO_RESTART_REQ=Changing live source will be applied after restarting Sync. Restart now?
================================================
FILE: Language/en-US/DefaultPlugin.Language.lang
================================================
[en-US]
LANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source
LANG_COMMANDS_EXIT=Stop works and Exit
LANG_COMMANDS_CLEAR=Clear screen
LANG_COMMANDS_STATUS=Get status of current work
LANG_COMMANDS_STOP=Stop current work
LANG_COMMANDS_START=Start sync
LANG_COMMANDS_HELP=Print help message
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Send a message to source for test
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Send a message to client for test
LANG_COMMANDS_SOURCES=get all source list or set a source
LANG_COMMANDS_MSGMGR=Execute with --help argument to get help
LANG_COMMANDS_FILTERS=List all available filters.
LANG_COMMANDS_DISABLE=disable <plugin name> Invoke Plugin OnDisable() function
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client] Switch to specific client
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd] Login to source
LANG_COMMANDS_RESTART=Restart application
LANG_COMMANDS_LANG=lang [cultureName] Get/Set language
LANG_COMMANDS_LISTLANG=listlang [--all] List (supported/all) languages
LANG_COMMANDS_BILIBILI=setbili <roomID> Set Source Bilibili RoomID
LANG_COMMANDS_FILTERS_ITEM=Item
LANG_COMMANDS_FILTERS_OBJ=Object
LANG_COMMANDS_SET_OSU_BOT=setosubot (botirc) (botirc_pw) (targetirc) Set OSUIRCBot Accounts
LANG_COMMANDS_BOTIRC_CURRENT=Current BotIRC: {0:S}
LANG_COMMANDS_BOTIRC_SET=Set Current BotIRC to {0:S}
LANG_COMMANDS_IRC_CURRENT=Current Target IRC: {0:S}
LANG_COMMANDS_IRC_SET=Set Current Target IRC to {0:S}
LANG_COMMANDS_TARGET_CURRENT=Current LiveID: {0:S}
LANG_COMMANDS_TARGET_SET=Set Current LiveID to
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_AUTHOR=Author
LANG_COMMANDS_SOURCES_NAME=Source
LANG_COMMANDS_SOURCES_AUTHOR=Author
LANG_COMMANDS_CURRENT=Set to {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=Current source is not a Sendable source.
LANG_COMMANDS_EXIT_DONE=Exit action execution done, please close the window.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu! irc is not connected, cannot send message to client.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Require Login to source!
LANG_COMMANDS_START_ALREADY_RUN=An instance is already running
LANG_COMMANDS_ARGUMENT_WRONG=Wrong argument.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Lower Level for less messaging\n--option <type> :auto/force_all/force_limit
LANG_COMMANDS_MSGMGR_LIMIT=Limited...
LANG_COMMANDS_MSGMGR_FREE=Unlimited
LANG_COMMANDS_MSGMGR_STATUS=MessageManager mode:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Set speed limit to {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=Set limit type to {0}
LANG_SEND_COOKIE_SAVED=Login infomation succesfully saved
LANG_SEND_DONE=Message Sent.
LANG_DOUYU_FAIL=Checking connection status failed! Except {0}, Result {1}
LANG_DOUYU_AUTH_SUCC=Auth to Douyutv success
LANG_DOUYU_DANMAKU=Recive message: {0}:{1}
LANG_DOUYU_GIFT=Gift
LANG_BILIBILI_ONLINECHANGE=Online change: {0}
LANG_COMMANDS_CLIENTUSERMSG=chatuser <username> <message> Send irc message to live with specified username
LANG_OSUIRC_LOGIN_SUCCESS=Login succesfully.
LANG_OSUIRC_LOGIN_FAILED=Try to reconnect to osu!irc failed,reason:{0}
LANG_OSUIRC_NETWORK_INTERRUPTED=Network is interrupted,now try to reconnect.
LANG_OSUIRC_RECIVER_FINISHED=Reciver thread is finished.
================================================
FILE: Language/en-US/NowPlaying.Languages.lang
================================================
[en-US]
OSU_PATH_NOT_SET=osu! path is empty, program will search the running osu! instance.
FIND_OSU_PATH=Can't find osu! path! {0:S}
OSU_PATH_FAIL=Can't find osu! path, Detailed info is disabled.
ERROR_WHILE_FIND_PATH=Error while searching osu! path {0:S}
UNKNOWN_COMMAND=Unknown command {0:S}
STATUS_PLAYING=Playing
STATUS_EDITING=Editing
STATUS_OTHER=Listening
STATUS_TIP_INFO=I'm {0:S}{1:S}
STATUS_TIP_INFO_WRAP=I'm {0:S}{1:S}
ERROR_WHILE_SEARCH_MAP=Error while searching {0:S}-{1:S} [{2:S}] {3:S}
CONSOLE_OUTPUT_RESULT=File:{0:S} ({1}ms) HP/CS/AR/OD: {2}{3}{4}{5}
OUTPUT_RESULT=Current {0}:{1}
CURRENT_IDLE=Currently idle
================================================
FILE: Language/en-US/OsuRTDataProvider.DefaultLanguage.lang
================================================
[en-US]
LANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]Cannot find osu!.exe process
LANG_OSU_FOUND=[OsuRTDataProvider][ID:{0}]Found osu!.exe process
LANG_INIT_PLAY_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init PlayFinder Failed! Retry after {1} seconds
LANG_INIT_PLAY_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init PlayFinder Success!
LANG_INIT_STATUS_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init StatusFinder Failed! Retry after {1} seconds
LANG_INIT_STATUS_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init StatusFinder Success!
LANG_INIT_BEATMAP_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init BeatmapFinder Failed! Retry after {1} seconds
LANG_INIT_BEATMAP_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init BeatmapFinder Success!
LANG_INIT_MODE_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init ModeFinder Failed! Retry after {1} seconds
LANG_INIT_MODE_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init ModeFinder Success!
LANG_BEATMAP_NOT_FOUND=Beatmap not found
================================================
FILE: Language/en-US/RealTimePPDisplayer.DefaultLanguage.lang
================================================
[en-US]
UI_MENU_TOPMOST=Topmost
TEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP File: {0}
MMF_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]Memory Mapping File: {0}
================================================
FILE: Language/en-US/RecentlyUserQuery.DefaultLanguage.lang
================================================
[en-US]
LANG_HELP=\nThis is a help for osu!irc common commands(in osu!irc please add "?" at the beginning of commands)\nrecently --status | Get the status of the current log (osu!irc unavailable)\nrecently --u <userName> | Get the <userName> history (Not recommended for osu!irc use)\nrecently --i <userId> | Get the <userId> history (Not recommended for osu!irc use)\nrecently | Get recent username and ID, ID can be used to perform actions like "?ban --i" (osu!irc supported)\nrecently --disable | Message logging disabled, all logs have been cleared (osu!irc supported)\nrecently --start | Start logging again (osu!irc supported)\nrecently --realloc <count> | Reallocate the capacity of the logs to store more logs (osu!irc supported)\nrecently --recently | Get recent user id\n
LANG_MSG_STATUS=MessageRecord status: {0} | recordCount/Capacity : {1}/{2}
LANG_RUNNING=running
LANG_STOP=stopped
LANG_MSG_DISABLE=Message logging disabled, all logs have been cleared
LANG_MSG_START=Message logging has been started
LANG_MSG_REALLOC_ERR=MessageRecord: Wrong instructions
LANG_MSG_REALLOC=You can now log the message history for {0}
LANG_MSG_NOTIMPLENT=Not implemented
LANG_MSG_UNKNOWNCOMMAND=Unknown command.
================================================
FILE: Language/en-US/Sync.Tools.DefaultI18n.lang
================================================
[en-US]
LANG_Loading=Loading....
LANG_Plugins=Loaded {0:D} Plugins
LANG_Sources=Loaded {0:D} Sources
LANG_Client=Loaded {0:D} Clients
LANG_Error=CAN NOT INITIAL WARPPERS! CHECK YOUR PLUGINS.
LANG_Commands=Loaded {0:D} Commands
LANG_Filters=Loaded {0:D} Filters
LANG_Ready=Done
LANG_RqueireLogin=Please login to your account
LANG_AccountName=Username:
LANG_AccountPw=Password:
LANG_AccountSave=Account succesfully saved!
LANG_Start=Starting...
LANG_Stopping=Stopping...
LANG_Restarting=Restarting...
LANG_LoadingPlugin=Load {0:S} ...
LANG_LoadPluginErr=Can't load {0:S} ({1:S})
LANG_NotPluginErr={0:S} not a standard plugin ({1:S})
LANG_NotConfig=Please edit 'config.ini' for initial settings.
LANG_NoSource=Can't find a source for warpper. Please install a source.
LANG_MissSource=Can't find source from the specific settings.
LANG_SetSource=Set {0:S} as current live source
LANG_SupportSend=After login you can send a message via source (Command: login [user] [passwd])
LANG_CertLength=Certification Length: {0:D}
LANG_CertExist=Current certification exist, override it with login command
LANG_SendNotReady=Current source is not ready for send a danmaku.
LANG_UnknowCommand=Unknown command, type 'help' for command list.
LANG_CommandFail=Command execution failed, type 'help' for command list.
LANG_ConfigFile=Settings
LANG_UserCount=User Count change : {0:D}
LANG_UserCount_Change=Spectators {0:S} to {1:D}
LANG_UserCount_Change_Increase=increase
LANG_UserCount_Change_Decrease=reduce
LANG_Source_Disconnecting=Disconnecting the source connection...
LANG_Source_Disconnected=Source server has been disconnected. Retry after 3 sec.
LANG_Source_Disconnected_Succ=Successfully disconnected from the source server.
LANG_Source_Connect=Connecting to source server...
LANG_Source_Connected_Succ=Success connected to source server!
LANG_Current_Online=Current online : {0:D}
LANG_Gift_Sent=I send {O:D} {1:S} to you!
LANG_Config=Settings:
LANG_Config_Status_OK=OK, LiveID:{0}
LANG_Config_Status_Fail=Configuration failed.
LANG_Source=Source{0:S}:
LANG_IRC=Client:
LANG_Danmaku=Danmaku Send:
LANG_Status_Connected=Connected
LANG_Status_NotConenct=Idle
LANG_Loading_Config=Loading settings...\n
LANG_Welcome=osu!Live Sync ver {0:S}
LANG_Help=Type 'help' command for help
LANG_Command=Command
LANG_Command_Description=Description
LANG_Plugin_Cycle_Reference=The plugin is cycle referenced. {0:S} will not load without the dependent tree.
LANG_IRC_Connecting=[Client] connecting...
LANG_IRC_Disconnect=Disconnecting from IRC server...
LANG_IRC_Connect_Timeout=Client connection failed,please check your internet connection.
LANG_IRC_Ready=[Client] is ready!
LANG_MsgMgr_Limit=Message limiter is toggled ON, the danmaku only with ?send prefix will be sent to irc
LANG_MsgMgr_Free=Message limiter is toggled OFF.
LANG_Instance_Exist=Sync is already started.
LANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source
LANG_COMMANDS_EXIT=Stop sync and Exit
LANG_COMMANDS_CLEAR=Clear output screen
LANG_COMMANDS_STATUS=Get status of current Source and Client
LANG_COMMANDS_STOP=Stop sync
LANG_COMMANDS_START=Start sync
LANG_COMMANDS_HELP=Print help message
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Send a message to source for test
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Send a message to client for test
LANG_COMMANDS_SOURCES=get all source list or set a source
LANG_COMMANDS_MSGMGR=Execute with '--help' to get help
LANG_COMMANDS_FILTERS=List all available filters.
LANG_COMMANDS_DISABLE=disable <plugin name> Invoke Plugin OnDisable() function
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client] Switch to specific client
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd] Login to source
LANG_COMMANDS_RESTART=Restart Sync
LANG_COMMANDS_LANG=lang [cultureName] Get/Set language
LANG_COMMANDS_LISTLANG=listlang [--all] List (supported/all) languages
LANG_COMMANDS_FILTERS_ITEM=Item
LANG_COMMANDS_FILTERS_OBJ=Object
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_AUTHOR=Author
LANG_COMMANDS_SOURCES_NAME=Source
LANG_COMMANDS_SOURCES_AUTHOR=Author
LANG_COMMANDS_CURRENT=Set to {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=Current source is not a Sendable source.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!irc not connect properly, can't send message.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Require Login to source!
LANG_COMMANDS_START_ALREADY_RUN=An instance is already running
LANG_COMMANDS_ARGUMENT_WRONG=Wrong argument.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Lower Level for less messaging\n--option <type> :Auto/ForceAll/ForceLimit/DisableAll
LANG_COMMANDS_MSGMGR_LIMIT=MessageManager is limited...
LANG_COMMANDS_MSGMGR_FREE=MessageManager is freed...
LANG_COMMANDS_MSGMGR_STATUS=MessageManager mode:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Set speed limit to {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=Set limit type to {0}
LANG_COMMANDS_START_NO_SOURCE=need select a Source before start.
LANG_COMMANDS_START_NO_CLIENT=need select a Client before start.
LANG_COMMANDS_CURRENT_LANG=Current language: {0:S} {1:S}
LANG_COMMANDS_LANG_SWITCHED=succesfully switch language to {1:S}({0:S})
LANG_COMMANDS_LANG_NOT_FOUND=switch language fail! use 'listlang' show all available language
LANG_UPDATE_DONE=Update done. Restart to complete update.
LANG_INSTALL_DONE=Install done. Restart to complete install.
LANG_PLUGIN_NOT_FOUND=Plugin {0} is not exist
LANG_REMOVE_DONE=Remove done. Restart to apply effect
LANG_VERSION_LATEST_OR_CANEL={0} is up-to-date or user caneled update operation.
LANG_UPDATE_CHECK_ERROR=Cannot check update for [{0}] : {1} : {2}
LANG_UPDATE_ERROR=Cannot update : {0} : {1}
LANG_SOURCE_NOT_SUPPORT_SEND=The source {0} not support send message yet.
LANG_NO_PLUGIN_SELECT=Must specify a plugin name
LANG_PLUGIN_DISABLED=Disabled
LANG_COMMANDS_CLIENTUSERMSG=chatuser <username> <message> send message as username for irc test
LANG_COMMANDS_EXIT_DONE=Exit action execution done, please close the window.
LANG_NO_ANY_SOURCE="There is no source available, please check Plugin folder or input 'plugins install DefaultPlugin' to install plugin for default sources."
================================================
FILE: Language/hu-HU/BanManagerPlugin.DefaultLanguage.lang
================================================
[hu-HU]
LANG_HELP_BAN=ban user/id/regex , felhasznl kitiltsa, zenet kldve lesz IRC-re is
LANG_HELP_UNBAN=unban user/id/regex , felhasznl tiltssnak feloldsa
LANG_HELP_WHITELIST=add user/id/regex felhasznl engedlylisthoz adsa, akik tudnak IRC-re zenetet kldeni
LANG_HELP_REMOVE_WHITELIST=remove user/id/regex felhasznl engedlylistrl val levtele
LANG_HELP_ACCESS=hozzfrsi szint belltsa az IRC-en val zenetkldshez
LANG_HELP_LIST=list whitelist(engedlylista) vagy banlist(tiltslista)
LANG_ERR_COMMAND=parancs hiba
================================================
FILE: Language/hu-HU/DefaultGUI.Language.lang
================================================
[hu-HU]
UI_DISPLAY=Fellet mutatsa
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS=IRC Jelsz
UI_TIPS_STATUS=Sttusz
UI_TIPS_DANMAKU=LiveID
UI_TIPS_OSU_IRC=osu!Chat
UI_TIPS_TARGET_IRC=IRC cm
UI_BOTTON_START=Indts
UI_BOTTON_STOP=Lellts
UI_BOTTON_LOGIN_DANMAKU=Platform bejelentkezs
UI_BOTTON_SWITCH_CON=Vlts CMD felletre
UI_BOTTON_EXIT=Kilps
UI_TIPS_LIVE_ID=LiveID
UI_TIPS_LIVE_SOURCE=Platform
UI_INFO_RESTART_REQ=Platform megvltoztatshoz jraindts szksges. jraindtod most?
================================================
FILE: Language/hu-HU/DefaultPlugin.Language.lang
================================================
[hu-HU]
LANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source
LANG_COMMANDS_EXIT=Folyamatok lelltsa s Kilps
LANG_COMMANDS_CLEAR=Kperny tiszttsa
LANG_COMMANDS_STATUS=Fut folyamatok sttusza
LANG_COMMANDS_STOP=Jelenlegi folyamat lelltsa
LANG_COMMANDS_START=Folyamat indtsa
LANG_COMMANDS_HELP=Segtsg msolsa
LANG_COMMANDS_SOURCEMSG=sourcemsg <message> Teszt ezenet kldse a platformnak
LANG_COMMANDS_CLIENTMSG=clientmsg <message> Teszt ezenet kldse a kliensnek
LANG_COMMANDS_SOURCES=sszes platform lekrdezse vagy belltsa
LANG_COMMANDS_MSGMGR=Vgrehajts --help parancsal a sghoz
LANG_COMMANDS_FILTERS=sszes szr listzsa.
LANG_COMMANDS_DISABLE=disable <plugin name> Plugin funkcijnak kikapcsolsa
LANG_COMMANDS_SWITCH_CLIENT=switchclient [client] Meghatrozott kliensre vlts
LANG_COMMANDS_SOURCELOGIN=sourcelogin [user] [passwd] Bejelentkezs platformra
LANG_COMMANDS_RESTART=Program jraindtsa
LANG_COMMANDS_LANG=lang [cultureName] Nyelv lekrdezse/belltsa
LANG_COMMANDS_LISTLANG=listlang [--all] Nyelvlista (tmogatott/sszes)
LANG_COMMANDS_BILIBILI=setbili <roomID> Bilibili platform RoomID belltsa
LANG_COMMANDS_FILTERS_ITEM=Trgy
LANG_COMMANDS_FILTERS_OBJ=Objektum
LANG_COMMANDS_SET_OSU_BOT=setosubot (botirc) (botirc_pw) (targetirc) OSUIRCBot Felhasznl belltsa
LANG_COMMANDS_BOTIRC_CURRENT=Jelenlegi BotIRC: {0:S}
LANG_COMMANDS_BOTIRC_SET=BotIRC jelenlegi belltsa erre: {0:S}
LANG_COMMANDS_IRC_CURRENT=Clpont IRC: {0:S}
LANG_COMMANDS_IRC_SET=Clpont IRC belltsa ide {0:S}
LANG_COMMANDS_TARGET_CURRENT=Jelenlegi LiveID: {0:S}
LANG_COMMANDS_TARGET_SET=Jelenlegi LiveID belltsa ide
LANG_COMMANDS_CLIENT_NAME=Kliens
LANG_COMMANDS_CLIENT_AUTHOR=Szerz
LANG_COMMANDS_SOURCES_NAME=Platform
LANG_COMMANDS_SOURCES_AUTHOR=Szerz
LANG_COMMANDS_CURRENT=Bellts erre: {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=Jelenlegi platform nem egy zenetkld platform.
LANG_COMMANDS_EXIT_DONE=Kilps parancs vgrehajtva, krlek zrd be az ablakot.
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu! irc nincs csatlakozva, nem tudsz zenetet kldeni a kliensnek.
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=Platformra val bejelentkezs szksges!
LANG_COMMANDS_START_ALREADY_RUN=Egy folyamat mr fut
LANG_COMMANDS_ARGUMENT_WRONG=Rosszul megadott argument.
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <level> :Kevesebb zenetkldshez cskkentsd a szintet\n--option <type> :auto/force_all/force_limit
LANG_COMMANDS_MSGMGR_LIMIT=Korltozott...
LANG_COMMANDS_MSGMGR_FREE=Korltlan
LANG_COMMANDS_MSGMGR_STATUS=MessageManager md:{4:S},sttusz:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=Sebessg hatr belltsa erre: {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=Tpus hatr belltsa erre: {0}
LANG_SEND_COOKIE_SAVED=Bejelentkezsi informci sikeresen mentve
LANG_SEND_DONE=zenet elkldve.
LANG_DOUYU_FAIL=Kapcsolat ellenrzse sikertelen! Except {0}, Result {1}
LANG_DOUYU_AUTH_SUCC=Douyutv bejelentkezs sikeres
LANG_DOUYU_DANMAKU=Fogadott zenet: {0}:{1}
LANG_DOUYU_GIFT=Ajndk
LANG_BILIBILI_ONLINECHANGE=Online vltozs: {0}
LANG_COMMANDS_CLIENTUSERMSG=chatuser <username> <message> IRC zenet kldse lbe egy megadott felhasznlnak
================================================
FILE: Language/hu-HU/NowPlaying.Languages.lang
================================================
[hu-HU]
OSU_PATH_NOT_SET=osu! megadott elrsi helye res, a program prblja megkeresni a fut osu! alkalmazst.
FIND_OSU_PATH=osu! elrsi helye nem tallhat! {0:S}
OSU_PATH_FAIL=osu! elrsi helye nem tallhat, Rszletes informcik letiltva.
ERROR_WHILE_FIND_PATH=Hiba trtnt az osu! elrsi helynek keressekor {0:S}
UNKNOWN_COMMAND=Ismeretlen parancs {0:S}
STATUS_PLAYING=Jtkban
STATUS_EDITING=Szerkeszt
STATUS_OTHER=Hallgatja
STATUS_TIP_INFO=n vagyok {0:S}{1:S}
STATUS_TIP_INFO_WRAP=n vagyok {0:S}{1:S}
ERROR_WHILE_SEARCH_MAP=Hiba keress kzben {0:S}-{1:S} [{2:S}] {3:S}
CONSOLE_OUTPUT_RESULT=Fjl:{0:S} ({1}ms) HP/CS/AR/OD: {2}{3}{4}{5}
OUTPUT_RESULT=Jelenlegi {0}:{1}
CURRENT_IDLE=Jelenleg ttlen
================================================
FILE: Language/hu-HU/OsuRTDataProvider.DefaultLanguage.lang
================================================
[hu-HU]
LANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0} osu!.exe folyamat nem tallhat
LANG_OSU_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exe folyamat szlelve
LANG_INIT_PLAY_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init PlayFinder Hiba! jraprblkozs {1} msodperc mlva
LANG_INIT_PLAY_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init PlayFinder Sikerlt!
LANG_INIT_STATUS_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init StatusFinder Hiba! jraprblkozs {1} msodperc mlva
LANG_INIT_STATUS_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init StatusFinder Sikerlt!
LANG_INIT_BEATMAP_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init BeatmapFinder Hiba! jraprblkozs {1} msodperc mlva
LANG_INIT_BEATMAP_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init BeatmapFinder Sikerlt!
LANG_INIT_MODE_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]Init ModeFinder Hiba! jraprblkozs {1} msodperc mlva
LANG_INIT_MODE_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]Init ModeFinder Sikerlt!
LANG_BEATMAP_NOT_FOUND=Beatmap nem tallhat
================================================
FILE: Language/hu-HU/RealTimePPDisplayer.DefaultLanguage.lang
================================================
[hu-HU]
UI_MENU_TOPMOST=Legnagyobb
TEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP File: {0}
MMF_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]Memory Mapping File: {0}
================================================
FILE: Language/hu-HU/RecentlyUserQuery.DefaultLanguage.lang
================================================
[hu-HU]
LANG_HELP=\nEz egy sg az osu!irc ltalnos parancsaihoz(osu!irc-ben krlek hasznlj "?" eltagot a parancso keltt)\nrecently --status | Jelenlegi zenetelzmny sttusznak lekrdezse (osu!irc nem lehetsges)\nrecently --u <userName> | <userName> elzmnynek lekrdezse (Nem ajnlott osu!irc hasznlata)\nrecently --i <userId> | <userId> elzmnynek lekrdezse (Nem ajnlott osu!irc hasznlata)\nrecently | Felhasznlnv s ID lekrdezse, az ID felhasznlhat parancsok vgrehajtshoz, pldul "?ban --i" (osu!irc tmogatott)\nrecently --disable | zenetek mentsnek kikapcsols, sszes zenetelzmny trlve (osu!irc tmogatott)\nrecently --start | zenetek mentsnek elkezdse (osu!irc tmogatott)\nrecently --realloc <count> | zenetelzmnyek trhelynek jraellenrzse tbb zenet trolshoz (osu!irc tmogatott)\nrecently --recently | Legutbbi felhasznl ID lekrdezse\n
LANG_MSG_STATUS=MessageRecord sttusz: {0} | recordCount/Capacity : {1}/{2}
LANG_RUNNING=fut
LANG_STOP=lelltott
LANG_MSG_DISABLE=zenetek mentse letiltva, az sszes trolt zenet elzmny trlve
LANG_MSG_START=zenetek mentse elkezddtt
LANG_MSG_REALLOC_ERR=MessageRecord: Rossz parancs
LANG_MSG_REALLOC=zenetek lehetsges trolsi ideje: {0}
LANG_MSG_NOTIMPLENT=Nincs beptve
LANG_MSG_UNKNOWNCOMMAND=Ismeretlen parancs.
================================================
FILE: Language/hu-HU/Sync.Tools.DefaultI18n.lang
================================================
[hu-HU]
LANG_Loading=Betlts...
LANG_Plugins=Betltve {0:D} Plugin
LANG_Sources=Betltve {0:D} Platform
LANG_Client=Betltve {0:D} Kliens
LANG_Error=Warpper nem tlthet be! ELLENRIZD A PLUGINOKAT.
LANG_Commands=Betltve {0:D} Parancs
LANG_Filters=Betltve {0:D} Szr
LANG_Ready=Ksz
LANG_RqueireLogin=Krlek lpj be a fikodba
LANG_AccountName=Felhasznlnv:
LANG_AccountPw=Jelsz:
LANG_AccountSave=Fik sikeresen mentve!
LANG_Start=Indts...
LANG_Stopping=Lellts...
LANG_Restarting=jraindts...
LANG_LoadingPlugin={0:S} betltse...
LANG_LoadPluginErr=Nem lehet betlteni {0:S} ({1:S})
LANG_NotPluginErr={0:S} nem egy ltalnos plugin ({1:S})
LANG_NotConfig=Krlek szerkeszd a 'config.ini'-t tovbbi belltsokrt.
LANG_NoSource=Warpper platform nem tallhat. Krlek telepts egy platformot.
LANG_MissSource=A megadott belltsokkal platform nem tallhat.
LANG_SetSource={0:S} belltsa jelenlegi l platformnak
LANG_SupportSend=Bejelentkezs utn a platformon keresztl tudsz zenetet kldeni (Parancs: login [user] [passwd])
LANG_CertLength=Bizonylat hosszsga: {0:D}
LANG_CertExist=Jelenlegi bizonylat mr ltezik, bejelentkezsi paranccsal fellrhat
LANG_SendNotReady=Jelenlegi paltform nem ll kszen zenet kldsre.
LANG_UnknowCommand=Ismeretlen parancs, rj 'help' parancsot a sghoz.
LANG_CommandFail=Parancs vgrehajtsi hiba, rj 'help' parancsot a sghoz.
LANG_ConfigFile=Belltsok
LANG_UserCount=Felhasznl szm vltozs : {0:D}
LANG_UserCount_Change=Megfigyelk {0:S} to {1:D}
LANG_UserCount_Change_Increase=nvels
LANG_UserCount_Change_Decrease=cskkents
LANG_Source_Disconnecting=Platform kapcsolat lecsatlakozs...
LANG_Source_Disconnected=Lecsatlakozva a platform szerverrl. jracsatlakozs 3 msodperc mlva.
LANG_Source_Disconnected_Succ=Sikeresen lecsatlakoztl a platform szerverrl.
LANG_Source_Connect=Csatlakozs a platform szervehez...
LANG_Source_Connected_Succ=Sikeres csatlakozs apaltform szerverhez
LANG_Current_Online=Jelenleg elrhet : {0:D}
LANG_Gift_Sent=Kldk {O:D} {1:S} neked!
LANG_Config=Belltsok:
LANG_Config_Status_OK=OK, LiveID:{0}
LANG_Config_Status_Fail=Konfigurls sikertelen.
LANG_Source=Platform{0:S}:
LANG_IRC=Kliens:
LANG_Danmaku=zenet kldse:
LANG_Status_Connected=Csatlakozva
LANG_Status_NotConenct=Ttlen
LANG_Loading_Config=Belltsok betltse...\n
LANG_Welcome=osu!Live Sync vezi {0:S}
LANG_Help=rj 'help' parancsot a sgrt
LANG_Command=Parancs
LANG_Command_Description=Lers
LANG_Plugin_Cycle_Reference=A plugin ciklushoz kttt. {0:S} megfelel gazata nlkl nem fog betlteni.
LANG_IRC_Connecting=[Client] csatlakozs...
LANG_IRC_Disconnect=Lecsatlakozs az IRC szerverrl...
LANG_IRC_Connect_Timeout=Kliens csatlakozs sikertelen, krlek ellenrizd az internet kapcsolatodat.
LANG_IRC_Ready=[Client] kszen ll!
LANG_MsgMgr_Limit=zenet korltoz BEKAPCSOLVA, az zenet csak ?send eltaggal lesz elkldve IRC-re
LANG_MsgMgr_Free=zenet korltoz KIKAPCSOLVA.
================================================
FILE: Language/ja-JP/BanManagerPlugin.DefaultLanguage.lang
================================================
[ja-JP]
LANG_HELP_BAN=ban user/id/regex ,bZ[WIRCɑM܂
LANG_HELP_UNBAN=unban user/id/regex
LANG_HELP_WHITELIST=add user/id/regex IRCɃbZ[W𑗐MłzCgXgɒlj܂
LANG_HELP_REMOVE_WHITELIST=remove user/id/regex ŃzCgXg폜
LANG_HELP_ACCESS=IRCɃbZ[W𑗐M邽߂̃ANZXxݒ肷
LANG_HELP_LIST=zCgXgEBANXg
LANG_ERR_COMMAND=R}hG[
================================================
FILE: Language/ja-JP/BeatmapSuggest.DefaultLanguage.lang
================================================
[ja-JP]
LANG_GET_BEATMAP_FAILED={0} r[g}bv̏̎擾Ɏs܂BG[bZ[W: {1}
LANG_SUGGEST_MEG={0} r[g}bvvCꍇ [{1} {2}] || [{3} dl] || [{4} mirror] ?dl ?dl all Ɠ͂Ă
LANG_NOT_FOUND_ERR=beatmapSetID̏ƈvȂp[^[IDbeatmapSetIDł
LANG_UNKNOWN_TITLE=<s̃^Cg>
LANG_GET_BEATMAP_TIME_OUT=r[g}bv擾܂ {0}b^CAEg ^XNXe[^X: {1}
LANG_INVAILD_ID={0} ͖IDł
LANG_UNKOWN_PARAM={0} p[^[͌܂ł
LANG_ERROR_INFO_IMCOMPLETE=sSȏ
LANG_NO_API_KEY_NOFITY=config.iniosu!APIL[܂Bgp邽߂osu!APIL[ݒ肵Ă (osu!APIL[͂擾ł܂: https://osu.ppy.sh/p/api )
LANG_START_DOWNLOAD=r[g}bṽ_E[hJn܂: {0}
LANG_FINISH_DOWNLOAD={0} r[g}bv_E[h܂
LANG_FAILED_DOWNLOAD={0} ̃_E[hɎs܂BG[bZ[W: {1}
LANG_DOWNLOAD_TASK_COUNT={0} ̃r[g}bṽ_E[hJn܂
================================================
FILE: Language/ja-JP/ConfigGUI.DefaultLanguage.lang
================================================
[ja-JP]
BUTTON_OPEN=J
BUTTON_BROWSE=Q
BUTTON_FONT=tHg
BUTTON_COLOR=F
WINDOW_TITLE=ݒ
BUTTON_SAVE=ۑ
LABEL_SAVED=ۑ܂I
LABEL_SAVED_SAVING=ۑ...
WINDOW_TITLE_REQUIRE_RESTART=ݒLɂɂ͍ċNĂ
================================================
FILE: Language/ja-JP/DefaultGUI.Language.lang
================================================
[ja-JP]
UI_DISPLAY=UI\
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS=IRC pX[h
UI_TIPS_STATUS=Xe[^X
UI_TIPS_DANMAKU=LiveID
UI_TIPS_OSU_IRC=osu!Chat
UI_TIPS_TARGET_IRC=IRC
UI_BOTTON_START=Jn
UI_BOTTON_STOP=~
UI_BOTTON_LOGIN_DANMAKU=\[XɃOC
UI_BOTTON_SWITCH_CON=R}hUIɐւ
UI_BOTTON_EXIT=I
UI_TIPS_LIVE_ID=LiveID
UI_TIPS_LIVE_SOURCE=\[X
UI_INFO_RESTART_REQ=SyncċNƃCu\[X̕ύXKp܂B ċN܂H
================================================
FILE: Language/ja-JP/DefaultPlugin.Language.lang
================================================
[ja-JP]
LANG_COMMANDS_LOGIN=login <[U[> [pX[h] Ń\[XɃOCăbZ[W𑗐M܂
LANG_COMMANDS_EXIT=Sync~ďI܂
LANG_COMMANDS_CLEAR=\Ă郍OZbg܂
LANG_COMMANDS_STATUS=\[XƃNCAǧ݂̃Xe[^X擾܂
LANG_COMMANDS_STOP=Sync~܂
LANG_COMMANDS_START=SyncJn܂
LANG_COMMANDS_HELP=wv\܂
LANG_COMMANDS_SOURCEMSG=sourcemsg <bZ[W> Ń\[XɃeXgbZ[W𑗐M܂
LANG_COMMANDS_CLIENTMSG=clientmsg <bZ[W> ŃNCAgɃeXgbZ[W𑗐M܂
LANG_COMMANDS_SOURCES=ׂẴ\[X̃Xg\邩A\[X̐ݒ܂
LANG_COMMANDS_MSGMGR=--help s邱ƂŃwv\܂
LANG_COMMANDS_FILTERS=gp\̃tB^[Xgɂĕ\܂
LANG_COMMANDS_DISABLE=disable <vOC> ŃvOCOnDisable()Ăяo܂
LANG_COMMANDS_SWITCH_CLIENT=switchclient [NCAg] ŃNCAgւ܂
LANG_COMMANDS_SOURCELOGIN=sourcelogin [[U[] [pX[h] Ń\[XɃOC܂
LANG_COMMANDS_RESTART=SyncċN܂
LANG_COMMANDS_LANG=lang [ꖼ (: ja-JP)] ύX܂
LANG_COMMANDS_LISTLANG=listlang [--all] Ή/ׂĂ̌̃Xg\܂
LANG_COMMANDS_BILIBILI=setbili <roomID> BiliBili\[XRoomIDݒ肵܂
LANG_COMMANDS_FILTERS_ITEM=ACe
LANG_COMMANDS_FILTERS_OBJ=IuWFNg
LANG_COMMANDS_SET_OSU_BOT=setosubot (botirc) (botirc_pw) (targetirc) OSUIRC BotAJEgݒ肵܂
LANG_COMMANDS_BOTIRC_CURRENT=݂BotIRC: {0:S}
LANG_COMMANDS_BOTIRC_SET=BotIRC {0:S} ɐݒ肵܂
LANG_COMMANDS_IRC_CURRENT=݂̃^[QbgIRC: {0:S}
LANG_COMMANDS_IRC_SET=^[QbgIRC {0:S} ɕύX܂
LANG_COMMANDS_TARGET_CURRENT=݂LiveID: {0:S}
LANG_COMMANDS_TARGET_SET=LiveIDύX܂
LANG_COMMANDS_CLIENT_NAME=NCAg
LANG_COMMANDS_CLIENT_AUTHOR=
LANG_COMMANDS_SOURCES_NAME=\[X
LANG_COMMANDS_SOURCES_AUTHOR=
LANG_COMMANDS_CURRENT={0:S} ɐݒ
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=݂̃\[Xł͑Mł܂
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!IRCɐڑłȂ߃bZ[W𑗐Mł܂
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=\[XɃOCĂI
LANG_COMMANDS_START_ALREADY_RUN=CX^X͂łɎsĂ܂
LANG_COMMANDS_ARGUMENT_WRONG=Ⴂ܂
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <x> :ႢxɂƃbZ[W点܂ \n--option <^Cv> : Auto/ForceAll/ForceLimit/DisableAll
LANG_COMMANDS_MSGMGR_LIMIT=bZ[W}l[W[͐Ă܂...
LANG_COMMANDS_MSGMGR_FREE=bZ[W}l[W[͊JĂ܂...
LANG_COMMANDS_MSGMGR_STATUS=bZ[W}l[W[ [h: {4:S}, Xe[^X: {0:D}, L[̐/̐/: {1} / {2} / {3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=x {0} ɕύX
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=̃^Cv {0} ɕύX
LANG_COMMANDS_START_NO_SOURCE=JnOɃ\[XIKv܂
LANG_COMMANDS_START_NO_CLIENT=JnOɃNCAgIKv܂
LANG_COMMANDS_CURRENT_LANG=݂̌: {0:S} {1:S}
LANG_COMMANDS_LANG_SWITCHED= {1:S}({0:S}) ɐւ܂
LANG_COMMANDS_LANG_NOT_FOUND=̐ւɎs܂I listlang R}hŌݗpł錾̃Xg\ł܂
LANG_SEND_COOKIE_SAVED=OCۑ܂
LANG_SEND_DONE=bZ[WM܂
LANG_DOUYU_FAIL=ڑXe[^X̊mFɎs܂I O: {0} : {1}
LANG_DOUYU_AUTH_SUCC=DouyutvFɐ
LANG_DOUYU_DANMAKU=bZ[WM: {0}:{1}
LANG_DOUYU_GIFT=Mtg
LANG_BILIBILI_ONLINECHANGE=IC̕ύX: {0}
LANG_OSUIRC_LOGIN_SUCCESS=OCɐ
LANG_OSUIRC_LOGIN_FAILED=osu!IRC̍ĐڑɎs܂B sR: {0}
LANG_OSUIRC_NETWORK_INTERRUPTED=lbg[Nf܂BĐڑĂ
LANG_OSUIRC_RECIVER_FINISHED=MXbhI܂
LANG_COMMANDS_CLIENTUSERMSG=chatuser <[U[> <bZ[W> IRCeXg̃[U[ŃbZ[W𑗐M܂
LANG_COMMANDS_EXIT_DONE=I܂BEBhEĂ
================================================
FILE: Language/ja-JP/NowPlaying.Languages.lang
================================================
[ja-JP]
OSU_PATH_NOT_SET=osu!̃pXݒ肳Ă܂Asosu!̃CX^X܂
FIND_OSU_PATH=osu!̃pX邱Ƃł܂I {0:S}
OSU_PATH_FAIL=osu!̃pX邱Ƃł܂Aڍ̕\͖ɂȂĂ܂B
ERROR_WHILE_FIND_PATH=osu!̃pXɃG[܂ {0:S}
UNKNOWN_COMMAND=R}h܂ {0:S}
STATUS_PLAYING=vC
STATUS_EDITING=ҏW
STATUS_OTHER=Đ
STATUS_TIP_INFO= {0:S}{1:S}
STATUS_TIP_INFO_WRAP= {0:S}{1:S}
ERROR_WHILE_SEARCH_MAP={0:S}-{1:S} [{2:S}] {3:S} ̌ɃG[܂
CONSOLE_OUTPUT_RESULT=t@C:{0:S} ({1}ms) HP/CS/AR/OD: {2} / {3} / {4} / {5}
OUTPUT_RESULT= {0}:{1}
CURRENT_IDLE=ݑҋ@
================================================
FILE: Language/ja-JP/OsuRTDataProvider.DefaultLanguage.lang
================================================
[ja-JP]
LANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exevZX܂ł
LANG_OSU_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exevZX܂
LANG_INIT_PLAY_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]PlayFindeȑɎs܂I {1} bɍĎs܂
LANG_INIT_PLAY_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]PlayFindeȑɐ܂I
LANG_INIT_STATUS_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]StatusFindeȑɎs܂I {1} bɍĎs܂
LANG_INIT_STATUS_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]StatusFindeȑɐ܂I
LANG_INIT_BEATMAP_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]BeatmapFindeȑɎs܂I {1} bɍĎs܂
LANG_INIT_BEATMAP_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]BeatmapFindeȑɐ܂I
LANG_INIT_MODE_FINDER_FAILED=[OsuRTDataProvider][ID:{0}]ModeFindeȑɎs܂I {1} bɍĎs܂
LANG_INIT_MODE_FINDER_SUCCESS=[OsuRTDataProvider][ID:{0}]ModeFindeȑɐ܂I
LANG_BEATMAP_NOT_FOUND=r[g}bv܂
================================================
FILE: Language/ja-JP/RealTimePPDisplayer.DefaultLanguage.lang
================================================
[ja-JP]
UI_MENU_TOPMOST=ŏ
TEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP t@C: {0}
MMF_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer][}bsOt@C: {0}
================================================
FILE: Language/ja-JP/RecentlyUserQuery.DefaultLanguage.lang
================================================
[ja-JP]
LANG_HELP=\nosu!IRC̃R}hwvł(osu!IRCł̓R}h̐擪 ? ljĂ)\nrecently --status | ݂̃Xe[^XO擾܂(osu!IRCł͎gps)\nrecently --u <[U[> | <[U[>̗擾܂(osu!IRCł̎gp͔)\nrecently --i <[U[ID> | <[U[ID>̗擾܂(osu!IRCł̎gp͔)\nrecently | ŋ߂̃[U[ID擾AIDgp ?ban --i Ȃǂ̃R}hsł܂(osu!IRCɑΉ)\nrecently --disable | bZ[WȌo͂ɂAׂẴO폜܂(osu!IRCɑΉ)\nrecently --start | ēxȌo͂Jn܂(osu!IRCɑΉ)\nrecently --realloc <JEg> | O̗eʂĊ蓖ĂăOۑeʂ𑽂܂(osu!IRCɑΉ)\nrecently --recently | ŋ߂̃[U[ID擾܂\n
LANG_MSG_STATUS=bZ[WL^̃Xe[^X: {0} | L^/e : {1}/{2}
LANG_RUNNING=ғ
LANG_STOP=~
LANG_MSG_DISABLE=bZ[WȌo͂ɂȂ肷ׂẴO܂
LANG_MSG_START=bZ[WȌo͂Jn܂
LANG_MSG_REALLOC_ERR=bZ[WL^: ߂ɊԈႢ܂
LANG_MSG_REALLOC={0} ̃bZ[WOɏo͂ł悤ɂȂ܂
LANG_MSG_NOTIMPLENT=Ă܂
LANG_MSG_UNKNOWNCOMMAND=R}h܂
================================================
FILE: Language/ja-JP/Sync.Tools.DefaultI18n.lang
================================================
[ja-JP]
LANG_Loading=Ǎ...
LANG_Plugins={0:D} ̃vOCǂݍ݂܂
LANG_Sources={0:D} ̃\[Xǂݍ݂܂
LANG_Client={0:D} ̃NCAgǂݍ݂܂
LANG_Error=bp[̏ł܂I vOCmFĂI
LANG_Commands={0:D} ̃R}hǂݍ݂܂
LANG_Filters={0:D} ̃tB^[ǂݍ݂܂
LANG_Ready=I
LANG_RqueireLogin=OCĂ
LANG_AccountName=[U[:
LANG_AccountPw=pX[h:
LANG_AccountSave=AJEgۑ܂I
LANG_Start=N...
LANG_Stopping=~...
LANG_Restarting=ċN...
LANG_LoadingPlugin={0:S} Ǎ...
LANG_LoadPluginErr={0:S} ǂݍ݂ł܂ł ({1:S})
LANG_NotPluginErr={0:S} ͒ʏ̃vOCł͂܂ ({1:S})
LANG_NotConfig=config.ini ҏWAݒĂ
LANG_NoSource=\[XɃbp[܂łB\[XCXg[Ă
LANG_MissSource=ݒ肩\[X邱Ƃł܂ł
LANG_SetSource=Cu\[X {0:S} ɕύX܂
LANG_SupportSend=OC\[X烁bZ[W𑗂邱Ƃł܂ (R}h: login [[U[] [pX[h])
LANG_CertLength=F؊: {0:D}
LANG_CertExist=Fłɑ݂܂Blogin R}hŏ㏑ĂB
LANG_SendNotReady=݂̃\[Xł͒e𑗐M鏀łĂ܂
LANG_UnknowCommand=R}h܂Bhelp Ɠ͂ƃR}hXg\邱Ƃł܂
LANG_CommandFail=R}hsɎs܂Bhelp Ɠ͂ƃR}hXg\邱Ƃł܂
LANG_ConfigFile=ݒ
LANG_UserCount=[U[̕ύX : {0:D}
LANG_UserCount_Change=XyN^[ {0:S} {1:D} ɂȂ܂
LANG_UserCount_Change_Increase=
LANG_UserCount_Change_Decrease=
LANG_Source_Disconnecting=\[X̐ڑؒfĂ܂...
LANG_Source_Disconnected=\[XT[o[ؒf܂B 3bɍĐڑ܂
LANG_Source_Disconnected_Succ=\[XT[o[ؒf܂
LANG_Source_Connect=\[XT[o[ɐڑ...
LANG_Source_Connected_Succ=\[XT[o[ɐڑ܂I
LANG_Current_Online=݂̃IC : {0:D}
LANG_Gift_Sent=Ȃ {O:D} {1:S} 𑗂܂I
LANG_Config=ݒ:
LANG_Config_Status_OK=OK, LiveID:{0}
LANG_Config_Status_Fail=s܂
LANG_Source=\[X {0:S}:
LANG_IRC=NCAg:
LANG_Danmaku=eM:
LANG_Status_Connected=ڑ
LANG_Status_NotConenct=ҋ@
LANG_Loading_Config=ݒǍ...\n
LANG_Welcome=osu!Live Sync o[W: {0:S}
LANG_Help=help Ɠ͂ƃwv\邱Ƃł܂
LANG_Command=R}h
LANG_Command_Description=
LANG_Plugin_Cycle_Reference=vOC͏zQƂ܂B {0:S} ͈ˑc[Ȃƃ[h܂
LANG_IRC_Connecting=[NCAg] ڑ...
LANG_IRC_Disconnect=IRCT[o[ؒf...
LANG_IRC_Connect_Timeout=NCAg̐ڑɎs܂BC^[lbg̐ڑmFĂ
LANG_IRC_Ready=[NCAg] I
LANG_MsgMgr_Limit=bZ[WIɐւ܂B?send vtBbNX܂܂ꂽêIRCɑM܂
LANG_MsgMgr_Free=bZ[WItɐւ܂B
LANG_Instance_Exist=Sync͂łɋNĂ܂
LANG_COMMANDS_LOGIN=login <[U[> [pX[h] Ń\[XɃOCăbZ[W𑗐M܂
LANG_COMMANDS_EXIT=Sync~ďI܂
LANG_COMMANDS_CLEAR=\Ă郍OZbg܂
LANG_COMMANDS_STATUS=\[XƃNCAǧ݂̃Xe[^X擾܂
LANG_COMMANDS_STOP=Sync~܂
LANG_COMMANDS_START=SyncJn܂
LANG_COMMANDS_HELP=wv\܂
LANG_COMMANDS_SOURCEMSG=sourcemsg <bZ[W> Ń\[XɃeXgbZ[W𑗐M܂
LANG_COMMANDS_CLIENTMSG=clientmsg <bZ[W> ŃNCAgɃeXgbZ[W𑗐M܂
LANG_COMMANDS_SOURCES=ׂẴ\[X̃Xg\邩A\[X̐ݒ܂
LANG_COMMANDS_MSGMGR=--help s邱ƂŃwv\܂
LANG_COMMANDS_FILTERS=gp\̃tB^[Xgɂĕ\܂
LANG_COMMANDS_DISABLE=disable <vOC> ŃvOCOnDisable()Ăяo܂
LANG_COMMANDS_SWITCH_CLIENT=switchclient [NCAg] ŃNCAgւ܂
LANG_COMMANDS_SOURCELOGIN=sourcelogin [[U[] [pX[h] Ń\[XɃOC܂
LANG_COMMANDS_RESTART=SyncċN܂
LANG_COMMANDS_LANG=lang [ꖼ (: ja-JP)] ύX܂
LANG_COMMANDS_LISTLANG=listlang [--all] Ή/ׂĂ̌̃Xg\܂
LANG_COMMANDS_FILTERS_ITEM=ACe
LANG_COMMANDS_FILTERS_OBJ=IuWFNg
LANG_COMMANDS_CLIENT_NAME=NCAg
LANG_COMMANDS_CLIENT_AUTHOR=
LANG_COMMANDS_SOURCES_NAME=\[X
LANG_COMMANDS_SOURCES_AUTHOR=
LANG_COMMANDS_CURRENT={0:S} ɐݒ
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=݂̃\[Xł͑Mł܂
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!IRCɐڑłȂ߃bZ[W𑗐Mł܂
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=\[XɃOCĂI
LANG_COMMANDS_START_ALREADY_RUN=CX^X͂łɎsĂ܂
LANG_COMMANDS_ARGUMENT_WRONG=Ⴂ܂
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <x> :ႢxɂƃbZ[W点܂ \n--option <^Cv> : Auto/ForceAll/ForceLimit/DisableAll
LANG_COMMANDS_MSGMGR_LIMIT=bZ[W}l[W[͐Ă܂...
LANG_COMMANDS_MSGMGR_FREE=bZ[W}l[W[͊JĂ܂...
LANG_COMMANDS_MSGMGR_STATUS=bZ[W}l[W[ [h: {4:S}, Xe[^X: {0:D}, L[̐/̐/: {1} / {2} / {3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=x {0} ɕύX
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=̃^Cv {0} ɕύX
LANG_COMMANDS_START_NO_SOURCE=JnOɃ\[XIKv܂
LANG_COMMANDS_START_NO_CLIENT=JnOɃNCAgIKv܂
LANG_COMMANDS_CURRENT_LANG=݂̌: {0:S} {1:S}
LANG_COMMANDS_LANG_SWITCHED= {1:S}({0:S}) ɐւ܂
LANG_COMMANDS_LANG_NOT_FOUND=̐ւɎs܂I listlang R}hŌݗpł錾̃Xg\ł܂
LANG_UPDATE_DONE=Abvf[g܂BċNƃAbvf[gK܂
LANG_INSTALL_DONE=CXg[܂BċNƃCXg[K܂
LANG_PLUGIN_NOT_FOUND={0} vOC݂܂
LANG_REMOVE_DONE=폜܂BKɂ͍ċNĂ
LANG_VERSION_LATEST={0} ͍ŐVł
LANG_UPDATE_CHECK_ERROR=[{0} ̃o[W̍XVmFł܂] : {1} : {2}
LANG_UPDATE_ERROR=XVł܂ : {0} : {1}
LANG_SOURCE_NOT_SUPPORT_SEND={0} \[X͂܂bZ[WMɑΉĂ܂
LANG_NO_PLUGIN_SELECT=vOCw肷Kv܂
LANG_PLUGIN_DISABLED=
LANG_COMMANDS_CLIENTUSERMSG=chatuser <[U[> <bZ[W> IRCeXg̃[U[ŃbZ[W𑗐M܂
LANG_COMMANDS_EXIT_DONE=I܂BEBhEĂ
LANG_NO_ANY_SOURCE=ugp\ȃvOC܂BvOCtH_[mF邩Aplugins install DefaultPlugin Ɠ͂ăftHg̃vOCCXg[ĂBv
================================================
FILE: Language/ru-RU/BanManagerPlugin.DefaultLanguage.lang
================================================
[ru-RU]
LANG_HELP_BAN= /id/regex , irc
LANG_HELP_UNBAN= /id/regex
LANG_HELP_WHITELIST= /id/regex , irc
LANG_HELP_REMOVE_WHITELIST= /id/regex
LANG_HELP_ACCESS= irc
LANG_HELP_LIST=
LANG_ERR_COMMAND=
================================================
FILE: Language/ru-RU/BeatmapSuggest.DefaultLanguage.lang
================================================
[ru-RU]
LANG_GET_BEATMAP_FAILED= {0} ,: {1}
LANG_SUGGEST_MEG={0} , [{1} {2}] || [{3} dl] || [{4} mirror] "?dl"/"?dl all"
LANG_NOT_FOUND_ERR= ID - beatmapSetID
LANG_UNKNOWN_TITLE=<unk title>
LANG_GET_BEATMAP_TIME_OUT= {0} ,TaskStatus{1}
LANG_INVAILD_ID= id {0}
LANG_UNKOWN_PARAM= {0}
LANG_ERROR_INFO_IMCOMPLETE=
LANG_NO_API_KEY_NOFITY= ApiKey config.ini, , osu!api_key . ApiKey:https://osu.ppy.sh/p/api
LANG_START_DOWNLOAD= : {0}
LANG_FINISH_DOWNLOAD= {0}
LANG_FAILED_DOWNLOAD= {0} ,: {1}
LANG_DOWNLOAD_TASK_COUNT= {0} .
================================================
FILE: Language/ru-RU/ConfigGUI.DefaultLanguage.lang
================================================
[ru-RU]
BUTTON_OPEN=
BUTTON_BROWSE=
BUTTON_FONT=
BUTTON_COLOR=
WINDOW_TITLE=
WINDOW_TITLE_REQUIRE_RESTART=
BUTTON_SAVE=
LABEL_SAVED=!
LABEL_SAVED_SAVING=...
COMMAND_LINE_HINT=[ConfigGUI] "config" .
TRAY_HIDE_SHOW=/
TRAY_CONFIG=
TRAY_OPEN_SYNC_FOLDER= Sync
TRAY_EXIT=
================================================
FILE: Language/ru-RU/DefaultGUI.Language.lang
================================================
[ru-RU]
UI_DISPLAY= UI
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS= IRC
UI_TIPS_STATUS=
UI_TIPS_DANMAKU=LiveID
UI_TIPS_OSU_IRC=osu!Chat
UI_TIPS_TARGET_IRC=ToIRC
UI_BOTTON_START=
UI_BOTTON_STOP=
UI_BOTTON_LOGIN_DANMAKU=
UI_BOTTON_SWITCH_CON= CMD UI
UI_BOTTON_EXIT=
UI_TIPS_LIVE_ID=LiveID
UI_TIPS_LIVE_SOURCE=
UI_INFO_RESTART_REQ= Sync. ?
================================================
FILE: Language/ru-RU/DefaultPlugin.Language.lang
================================================
[ru-RU]
LANG_COMMANDS_LOGIN=login <> []
LANG_COMMANDS_EXIT=
LANG_COMMANDS_CLEAR=
LANG_COMMANDS_STATUS=
LANG_COMMANDS_STOP=
LANG_COMMANDS_START= Sync
LANG_COMMANDS_HELP=
LANG_COMMANDS_SOURCEMSG=sourcemsg <message>
LANG_COMMANDS_CLIENTMSG=clientmsg <message>
LANG_COMMANDS_SOURCES=
LANG_COMMANDS_MSGMGR= --help,
LANG_COMMANDS_FILTERS=
LANG_COMMANDS_DISABLE=disabple < > OnDisable()
LANG_COMMANDS_SWITCH_CLIENT=switchclient []
LANG_COMMANDS_SOURCELOGIN=sourcelogin [] []
LANG_COMMANDS_RESTART=
LANG_COMMANDS_LANG=lang [cultureName] /
LANG_COMMANDS_LISTLANG=listlang [--all] (/)
LANG_COMMANDS_BILIBILI=setbili <roomID> Bilibili RoomID
LANG_COMMANDS_FILTERS_ITEM=
LANG_COMMANDS_FILTERS_OBJ=
LANG_COMMANDS_SET_OSU_BOT=setosubot (botirc) (botirc_pw) (targetirc) OSUIRCBot
LANG_COMMANDS_BOTIRC_CURRENT= BotIRC: {0:S}
LANG_COMMANDS_BOTIRC_SET= BotIRC {0:S}
LANG_COMMANDS_IRC_CURRENT= Target IRC: {0:S}
LANG_COMMANDS_IRC_SET= Target IRC {0:S}
LANG_COMMANDS_TARGET_CURRENT= LiveID: {0:S}
LANG_COMMANDS_TARGET_SET= LiveID {0:S}
LANG_COMMANDS_CLIENT_NAME=
LANG_COMMANDS_CLIENT_AUTHOR=
LANG_COMMANDS_SOURCES_NAME=
LANG_COMMANDS_SOURCES_AUTHOR=
LANG_COMMANDS_CURRENT= {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT= Sendable
LANG_COMMANDS_EXIT_DONE= , , .
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!irc , .
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN= !
LANG_COMMANDS_START_ALREADY_RUN=
LANG_COMMANDS_ARGUMENT_WRONG= .
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <> : - \n--option <> :auto/force_all/force_limit
LANG_COMMANDS_MSGMGR_LIMIT=...
LANG_COMMANDS_MSGMGR_FREE=
LANG_COMMANDS_MSGMGR_STATUS= MessageManager:{4:S},:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET= {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET= {0}
LANG_SEND_COOKIE_SAVED=
LANG_SEND_DONE= .
LANG_DOUYU_FAIL= ! {0}, {1}
LANG_DOUYU_AUTH_SUCC= Douyutv
LANG_DOUYU_DANMAKU= : {0}: {1}
LANG_DOUYU_GIFT=
LANG_BILIBILI_ONLINECHANGE= : {0}
LANG_COMMANDS_CLIENTUSERMSG=chatuser <username> <message> IRC
LANG_OSUIRC_LOGIN_SUCCESS= .
LANG_OSUIRC_LOGIN_FAILED= osu!irc , : {0}
LANG_OSUIRC_NETWORK_INTERRUPTED= , .
LANG_OSUIRC_RECIVER_FINISHED=Reciver thread is finished.
================================================
FILE: Language/ru-RU/NowPlaying.Languages.lang
================================================
[ru-RU]
OSU_PATH_NOT_SET= osu! , osu!.
FIND_OSU_PATH= osu! {0:S}
OSU_PATH_FAIL= osu!, .
ERROR_WHILE_FIND_PATH= osu! {0:S}
UNKNOWN_COMMAND= {0:S}
STATUS_PLAYING=
STATUS_EDITING=
STATUS_OTHER=
STATUS_TIP_INFO= {0:S} {1:S}
STATUS_TIP_INFO_WRAP= {0:S} {1:S}
ERROR_WHILE_SEARCH_MAP= {0:S}-{1:S} [{2:S}] {3:S}
CONSOLE_OUTPUT_RESULT=:{0:S} ({1}ms) HP/CS/AR/OD: {2}{3}{4}{5}
OUTPUT_RESULT= {0}:{1}
CURRENT_IDLE=
================================================
FILE: Language/ru-RU/OsuRTDataProvider.DefaultLanguage.lang
================================================
[ru-RU]
LANG_OSU_NOT_FOUND=[ID:{0}] osu!.exe
LANG_OSU_FOUND=[ID:{0}] osu!.exe
LANG_INIT_PLAY_FINDER_FAILED=[ID:{0}] PlayerFinder ! {1}
LANG_INIT_PLAY_FINDER_SUCCESS=[ID:{0}] PlayerFinder !
LANG_INIT_STATUS_FINDER_FAILED=[ID:{0}] StatusFinder ! {1}
LANG_INIT_STATUS_FINDER_SUCCESS=[ID:{0}] StatusFinder !
LANG_INIT_BEATMAP_FINDER_FAILED=[ID:{0}] BeatmapFinder ! {1}
LANG_INIT_BEATMAP_FINDER_SUCCESS=[ID:{0}] BeatmapFinder !
LANG_INIT_MODE_FINDER_FAILED=[ID:{0}] ModeFinder ! {1}
LANG_INIT_MODE_FINDER_SUCCESS=[ID:{0}] ModeFinder !
LANG_BEATMAP_NOT_FOUND=
ListenInterval= (ms)
EnableTourneyMode=
TeamSize=
DebugMode=
ForceOsuSongsDirectory= osu!
LANG_TOURNEY_HINT= : {0}
CHECK_GOTO_RELEASE_PAGE_HINT= "ortdp releases",
LANG_CHECK_ORTDP_UPDATE= OsuRTDataProvider({0})
GameMode=
DisableProcessNotFoundInformation= osu!,
EnableModsChangedAtListening= , ()
================================================
FILE: Language/ru-RU/RealTimePPDisplayer.DefaultLanguage.lang
================================================
[ru-RU]
UI_MENU_TOPMOST=
TEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer] pp: {0}
MMF_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer] Memory Mapping: {0}
FPS=FPS
TextOutputPath=
DisplayHitObject=
FontName=
PPFontSize= pp
PPFontColor= pp
HitCountFontSize=
HitCountFontColor=
BackgroundColor=
WindowHeight=
WindowWidth=
SmoothTime=Smooth Time
Topmost=
WindowTextShadow=WindowTextShadow
OutputMethods=
DebugMode=
PPFormat= pp
HitCountFormat=
RoundDigits=
IgnoreTouchScreenDecrease=
UseUnicodePerformanceInformation=
CHECK_RTPPD_UPDATE=[RealTimePPDisplayer] RealTimePPDisplayer({0})
CHECK_OPPAI_UPDATE=[RealTimePPDisplayer] oppai-ng ({0})
CHECK_GOTO_RELEASE_PAGE_HINT=[RealTimePPDisplayer] "rtpp releases", .
UI_UPDATE_CONFIGGUI_MESSAGEBOX=, ConfigGUI 0.2.1 .
HINT_BEATMAP_NO_FOUND=[RealTimePPDisplayer] ! Songs. ( OsuRTDataProvider, ).
HINT_CANNOT_WATCH_OTHER_PLAYER=[RealTimePPDisplayer] . ( , "By CuteSync Proxy" api ).
HINT_POBT_VERSION_LOWER=[RealTimePPDisplayer] PublicOsuBotTransfer , 1.3.0 "By CuteSync Proxy".
MBX_POBT_VERSION_NO_INSTALLED= PublicOsuBotTransfer .
UI_OPENEDITOR_BUTTON_CONTENT=
UI_MULTIOUTPUTEDITOR_BUTTON_CONTENT=
UI_NAME_LABEL=:
UI_FORMAT_LABEL=:
UI_DELETETHIS_BUTTON_CONTENT=
UI_SMOOTH_CHECKBOX_CONTENT=
UI_EDITFORMAT_BUTTON_CONTENT=
UI_SMMOTH_CHECKBOX_TOOLTIP=
UI_TYPE_COMBOBOX_TOOLTIP=
UI_FORMATTER_COMBOBOX_TOOLTIP=
UI_MODES_MULTISELECTCOMBOBOX_TOOLTIP=
RankingSendPerformanceToChat= pp
ByCuteSyncProxy=By CuteSync Proxy
ApiKey=Osu! Api
Formatter=
================================================
FILE: Language/ru-RU/RecentlyUserQuery.DefaultLanguage.lang
================================================
[ru-RU]
LANG_HELP=\n osu!irc ( osu!irc , , "?" )\nrecently --status | ( osu!irc)\nrecently --u <userName> | <userName> ( osu!irc)\nrecently --i <userId> | <userId> ( osu!irc)\nrecently | ID, ID , "?ban --i" ( osu!irc)\nrecently --disable | , ( osu!irc)\nrecently --start | ( osu!irc)\nrecently --realloc <count> | , ( osu!irc)\nrecently --recently | id \n
LANG_MSG_STATUS= MessageRecord: {0} | recordCount/ : {1}/{2}
LANG_RUNNING=
LANG_STOP=
LANG_MSG_DISABLE=
LANG_MSG_START=
LANG_MSG_REALLOC_ERR=MessageRecord:
LANG_MSG_REALLOC= {0}
LANG_MSG_NOTIMPLENT=
LANG_MSG_UNKNOWNCOMMAND= .
================================================
FILE: Language/ru-RU/Sync.Tools.DefaultI18n.lang
================================================
[ru-RU]
LANG_Loading=...
LANG_Plugins= {0:D} (-)
LANG_Sources= {0:D} (-)
LANG_Client= {0:D} (-)
LANG_Error=CAN NOT INITIAL WARPPERS! .
LANG_Commands= {0:D} (-)
LANG_Filters= {0:D} (-)
LANG_Ready=
LANG_RqueireLogin=,
LANG_AccountName= :
LANG_AccountPw=:
LANG_AccountSave= !
LANG_Start=...
LANG_Stopping=...
LANG_Restarting=...
LANG_LoadingPlugin= {0:S} ...
LANG_LoadPluginErr= {0:S} ({1:S})
LANG_NotPluginErr={0:S} ({1:S})
LANG_NotConfig=, 'config.ini' .
LANG_NoSource= wrapper. , .
LANG_MissSource= - .
LANG_SetSource= {0:S} live-
LANG_SupportSend= (: login [] [])
LANG_CertLength= : {0:D}
LANG_CertExist= ,
LANG_SendNotReady= danmaku.
LANG_UnknowCommand= , 'help' .
LANG_CommandFail= , 'help' .
LANG_ConfigFile=
LANG_UserCount= : {0:D}
LANG_UserCount_Change= {0:S} {1:D}
LANG_UserCount_Change_Increase=
LANG_UserCount_Change_Decrease=
LANG_Source_Disconnecting= ...
LANG_Source_Disconnected= . 3 .
LANG_Source_Disconnected_Succ= .
LANG_Source_Connect= ...
LANG_Source_Connected_Succ= !
LANG_Current_Online= : {0:D}
LANG_Gift_Sent= {0:D} {1:S}
LANG_Config=:
LANG_Config_Status_OK=OK, LiveID:{0}
LANG_Config_Status_Fail= .
LANG_Source={0:S}:
LANG_IRC=:
LANG_Danmaku=Danmaku :
LANG_Status_Connected=
LANG_Status_NotConenct=
LANG_Loading_Config= ...\n
LANG_Welcome=osu!Live Sync {0:S}
LANG_Help= 'help'
LANG_Command=
LANG_Command_Description=
LANG_Plugin_Cycle_Reference= . {0:S} .
LANG_IRC_Connecting=[] ...
LANG_IRC_Disconnect= IRC...
LANG_IRC_Connect_Timeout= , .
LANG_IRC_Ready=[] !
LANG_MsgMgr_Limit= , irc danmaku ?send
LANG_MsgMgr_Free= .
LANG_Instance_Exist=Sync .
LANG_COMMANDS_LOGIN=login <> []
LANG_COMMANDS_EXIT= Sync
LANG_COMMANDS_CLEAR=
LANG_COMMANDS_STATUS=
LANG_COMMANDS_STOP= Sync
LANG_COMMANDS_START= Sync
LANG_COMMANDS_HELP=
LANG_COMMANDS_SOURCEMSG=sourcemsg <message>
LANG_COMMANDS_CLIENTMSG=clientmsg <message>
LANG_COMMANDS_SOURCES=
LANG_COMMANDS_MSGMGR= --help,
LANG_COMMANDS_FILTERS=
LANG_COMMANDS_DISABLE=disable < > OnDisable()
LANG_COMMANDS_SWITCH_CLIENT=switchclient []
LANG_COMMANDS_SOURCELOGIN=sourcelogin [] []
LANG_COMMANDS_RESTART=
LANG_COMMANDS_LANG=lang [cultureName] /
LANG_COMMANDS_LISTLANG=listlang [--all] (/)
LANG_COMMANDS_FILTERS_ITEM=
LANG_COMMANDS_FILTERS_OBJ=
LANG_COMMANDS_CLIENT_NAME=
LANG_COMMANDS_CLIENT_AUTHOR=
LANG_COMMANDS_SOURCES_NAME=
LANG_COMMANDS_SOURCES_AUTHOR=
LANG_COMMANDS_CURRENT= {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT= Sendable
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu!irc , .
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN= !
LANG_COMMANDS_START_ALREADY_RUN=
LANG_COMMANDS_ARGUMENT_WRONG= .
LANG_COMMANDS_MSGMGR_HELP=\n--status \n--limit <> : - \n--option <> :auto/force_all/force_limit
LANG_COMMANDS_MSGMGR_LIMIT=MessageManager ...
LANG_COMMANDS_MSGMGR_FREE=MessageManager ...
LANG_COMMANDS_MSGMGR_STATUS=MessageManager mode:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET= {0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET= {0}
LANG_COMMANDS_START_NO_SOURCE= .
LANG_COMMANDS_START_NO_CLIENT= .
LANG_COMMANDS_CURRENT_LANG= : {0:S} {1:S}
LANG_COMMANDS_LANG_SWITCHED= {1:S}({0:S})
LANG_COMMANDS_LANG_NOT_FOUND= ! 'listlang'
LANG_UPDATE_DONE= . , .
LANG_INSTALL_DONE= . , .
LANG_PLUGIN_NOT_FOUND= {0}
LANG_REMOVE_DONE= . .
LANG_VERSION_LATEST={0}
LANG_UPDATE_CHECK_ERROR= [{0}] : {1} : {2}
LANG_UPDATE_ERROR= : {0} : {1}
LANG_SOURCE_NOT_SUPPORT_SEND= {0} .
LANG_NO_PLUGIN_SELECT=
LANG_PLUGIN_DISABLED=
LANG_COMMANDS_CLIENTUSERMSG=chatuser <username> <message> IRC
LANG_COMMANDS_EXIT_DONE= , , .
LANG_NO_ANY_SOURCE=" , 'plugins install DefaultPlugin', ".
================================================
FILE: Language/zh-CN/BanManagerPlugin.DefaultLanguage.lang
================================================
[zh-CN]
LANG_HELP_BAN=ֹijuser/id/regexϢirc
LANG_HELP_UNBAN=ֹijuser/id/regex
LANG_HELP_WHITELIST=ijuser/id/regex˽һֱȨϢirc
LANG_HELP_REMOVE_WHITELIST=ijuser/id/regexӰƳ
LANG_HELP_ACCESS=÷ϢircȨ
LANG_HELP_LIST=ȡֹ߽û
LANG_ERR_COMMAND=ָ
================================================
FILE: Language/zh-CN/DefaultGUI.Language.lang
================================================
[zh-CN]
UI_DISPLAY=ʾUI
UI_TIPS_BOTIRC=BotIRC
UI_TIPS_BOTIRC_PASS=IRC
UI_TIPS_STATUS=״̬
UI_TIPS_DANMAKU=ֱĻ
UI_TIPS_OSU_IRC=osu!
UI_TIPS_TARGET_IRC=ĿIRC
UI_BOTTON_START=ʼ
UI_BOTTON_STOP=ֹͣ
UI_BOTTON_LOGIN_DANMAKU=¼ֱ
UI_BOTTON_SWITCH_CON=л̨
UI_BOTTON_EXIT=˳
UI_TIPS_LIVE_ID=ֱ
UI_TIPS_LIVE_SOURCE=ֱԴ
UI_INFO_RESTART_REQ=ıֱԴ֮Ч
================================================
FILE: Language/zh-CN/DefaultPlugin.Language.lang
================================================
[zh-CN]
LANG_COMMANDS_LOGIN=login <user> [pass] ¼Ŀ굯ĻվĻ
LANG_COMMANDS_EXIT=˳
LANG_COMMANDS_CLEAR=Ļ
LANG_COMMANDS_STATUS=õǰ״̬
LANG_COMMANDS_STOP=ֹͣǰ
LANG_COMMANDS_START=ʼͬ
LANG_COMMANDS_HELP=ӡϢ
LANG_COMMANDS_SOURCEMSG=danmaku <message> ͵Ļ
LANG_COMMANDS_CLIENTMSG=chat <message> IRCϢ
LANG_COMMANDS_SOURCES=õǰеĻԴб
LANG_COMMANDS_MSGMGR=鿴Ϣ,--helpȡ
LANG_COMMANDS_FILTERS=беǰϢ
LANG_COMMANDS_DISABLE=ͽϢ disable ()
LANG_COMMANDS_SWITCH_CLIENT=лָClientʵΪȡClientб
LANG_COMMANDS_SOURCELOGIN=¼ĻԴ sourcelogin [û] []
LANG_COMMANDS_RESTART=Ӧó
LANG_COMMANDS_LANG=lang [cultureName] Get/Set language
LANG_COMMANDS_LISTLANG=listlang [--all] List (supported/all) languages
LANG_COMMANDS_BILIBILI=setbili roomID BilibiliֱԴķ
LANG_COMMANDS_FILTERS_ITEM=
LANG_COMMANDS_FILTERS_OBJ=
LANG_COMMANDS_SET_OSU_BOT=osuĻ˺ setosubot (˺) (IRC) (ĿIRC)
LANG_COMMANDS_BOTIRC_CURRENT=ǰBotIRC: {0:S}
LANG_COMMANDS_BOTIRC_SET=ǰBotIRCΪ {0:S}
LANG_COMMANDS_IRC_CURRENT=ǰĿIRC: {0:S}
LANG_COMMANDS_IRC_SET=ǰĿIRCΪ
LANG_COMMANDS_TARGET_CURRENT=ǰֱID: {0:S}
LANG_COMMANDS_TARGET_SET=ǰֱIDΪ
LANG_COMMANDS_CLIENT_NAME=Client
LANG_COMMANDS_CLIENT_AUTHOR=
LANG_COMMANDS_SOURCES_NAME=ĻԴ
LANG_COMMANDS_SOURCES_AUTHOR=
LANG_COMMANDS_CURRENT=ǰΪ {0:S}
LANG_COMMANDS_DANMAKU_NOT_SUPPORT=ʾǰĻԴַ֧͵ĻĻԴ\n
LANG_COMMANDS_EXIT_DONE=˳ɣڻδرգǿƹرա
LANG_COMMANDS_CHAT_IRC_NOTCONNECT=osu! irc δӣܷϢ
LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN=¼ܷ͵Ļ!
LANG_COMMANDS_START_ALREADY_RUN=ͬʵѾС
LANG_COMMANDS_ARGUMENT_WRONG=ȷ
LANG_COMMANDS_MSGMGR_HELP=\n--status :鿴ǰϢϢ\n--limit <ֵ> :ƷϢĵȼԽ;Խ״ܿ\n--option <> :ùܿصķʽautoԶܿأforce_allǿȫ,force_limitǽʹ?sendϢ
LANG_COMMANDS_MSGMGR_LIMIT=...
LANG_COMMANDS_MSGMGR_FREE=
LANG_COMMANDS_MSGMGR_STATUS=MessageManager mode:{4:S},status:{0:D},queueCount/limitCount/recoverTime:{1}/{2}/{3}
LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET=ƷٶȵȼΪ{0}
LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET=ϢĹƷʽΪ{0}
LANG_SEND_COOKIE_SAVED=½Ϣɹ
LANG_SEND_DONE=
LANG_DOUYU_FAIL=״̬ʧ! ڴ{0}, {1}
LANG_DOUYU_AUTH_SUCC=֤ɹ
LANG_DOUYU_DANMAKU=յĻ: {0}:{1}
LANG_DOUYU_GIFT=
LANG_BILIBILI_ONLINECHANGE=ֱ仯 {0}
================================================
FILE: Language/zh-CN/NowPlaying.Languages.lang
================================================
[zh-CN]
OSU_PATH_NOT_SET=δosuļ·ѰǰеosuԶ
FIND_OSU_PATH=ҵosu·! {0:S}
OSU_PATH_FAIL=δosuļ·Ҳûеosuʹô˲ܣú·osuSyncܼʹ
ERROR_WHILE_FIND_PATH=ϸϢʧܣ {0:S}
UNKNOWN_COMMAND=Ч{0:S}
STATUS_PLAYING=
STATUS_EDITING=
STATUS_OTHER=
STATUS_TIP_INFO={0:S}{1:S}
STATUS_TIP_INFO_WRAP={0:S}{1:S}
ERROR_WHILE_SEARCH_MAP=Լ{0:S}-{1:S} [{2:S}]ʱʧܣ{3:S}
CONSOLE_OUTPUT_RESULT=ļ{0:S} (ʱ: {1}) HP/CS/AR/OD: {2}{3}{4}{5}
OUTPUT_RESULT=ǰ{0}:{1}
CURRENT_IDLE=ǰûڴͼ
================================================
FILE: Language/zh-CN/RecentlyUserQuery.DefaultLanguage.lang
================================================
[zh-CN]
LANG_HELP=\nָcmd˺osu!irc˹ͨ(osu!ircڿͷ"?")\nrecently --status |ȡǰϢ¼״̬Ϣ(osu!irc)\nrecently --u <userName> |ȡû<userName>ʷϢ(osu!irc)\nrecently --i <userId> |ȡû<userId>ʷϢ(osu!irc)\nrecently |ȡûֺid,idִ"?ban --i"ָ(osu!irc)\nrecently --disable |رռ¼йܲ(osu!irc)\nrecently --start |¿ʼ¼(osu!irc)\nrecently --realloc <count> |·¼¼(osu!irc)\nrecently --recently |ȡûid\n
LANG_MSG_STATUS=MessageRecord status: {0} | recordCount/Capacity : {1}/{2}
LANG_RUNNING=running
LANG_STOP=stopped
LANG_MSG_DISABLE=Ϣ¼ѽã
LANG_MSG_START=Ϣ¼
LANG_MSG_REALLOC_ERR=MessageRecord: ָ
LANG_MSG_REALLOC=Ϣ¼ڿɼ¼ {0} ʷ¼
LANG_MSG_NOTIMPLENT=~
LANG_MSG_UNKNOWNCOMMAND=δ֪
================================================
FILE: Language/zh-CN/Sync.Tools.DefaultI18n.lang
================================================
[zh-CN]
LANG_Loading=ȡ....
LANG_Plugins= {0:D}
LANG_Sources= {0:D} ֱԴ
LANG_Client= {0:D} Client
LANG_Error=ܳʼȷǷѾװֱԴ.
LANG_Commands= {0:D}
LANG_Filters= {0:D}
LANG_Ready=
LANG_RqueireLogin=¼RnW˺
LANG_AccountName=û:
LANG_AccountPw=:
LANG_AccountSave=˻ɹ! ʼӵ
LANG_Start=ʼ....
LANG_Stopping=ֹͣ...
LANG_Restarting=¿ʼ...
LANG_LoadingPlugin= {0:S} ...
LANG_LoadPluginErr= {0:S} ({1:S})
LANG_NotPluginErr={0:S} osuSync ({1:S})
LANG_NotConfig= 'config.ini' ٿʼͬ
LANG_NoSource=ҵκֱԴ밲װһֱԴ
LANG_MissSource=ҲĬƥֱԴֱʹõһ
LANG_SetSource= {0:S} ΪֱĻԴ
LANG_SupportSend=ʾ:ǰĻԴ֧Ϸڷ͵ĻԴĹܣlogin [û] [] ¼!(û߿ѡ)
LANG_CertLength=Certification: {0:D}
LANG_CertExist=ʾǰе¼Certification¼踲ǣlogin [û] []иǣûѡ룩
LANG_SendNotReady=ǰClientδ־ĻͿã볢ʹLogin¼
LANG_UnknowCommand=δ֪ help鿴б
LANG_CommandFail=ִʧܣ help鿴б
LANG_ConfigFile=ļ
LANG_UserCount=û: {0:D}
LANG_UserCount_Change=ֱΧ{0:S}{1:D}
LANG_UserCount_Change_Increase=
LANG_UserCount_Change_Decrease=
LANG_Source_Disconnecting=ڶϿĻԴ....
LANG_Source_Disconnected=ӱϿ3
LANG_Source_Disconnected_Succ=ԴϿӳɹ
LANG_Source_Connect=ӵĻԴ....
LANG_Source_Connected_Succ=Դӳɹ
LANG_Current_Online=ǰ: {0:D}
LANG_Gift_Sent={O:D}{1:S}!
LANG_Config=ļ:
LANG_Config_Status_OK=OK, ID:{0}
LANG_Config_Status_Fail=δóɹ
LANG_Source=Դ{0:S}:
LANG_IRC=Client:
LANG_Danmaku=Ļ:
LANG_Status_Connected=
LANG_Status_NotConenct=δ
LANG_Loading_Config=ڶȡļ....\n
LANG_Welcome=ӭʹ osuֱĻͬ ver {0:S}
LANG_Help= 'help' ðб\n\n
LANG_Command=
LANG_Command_Description=
LANG_MsgMgr_Limit=ǰϢ ʼ ƣֻ?sendݲŻᷢ͵ircƵ
LANG_MsgMgr_Free=ǰϢ ,ݿֱӷ͵ircƵ
LANG_Plugin_Cycle_Reference=ֲ֮ѭùϵ {0:S} ᰴտָϵм
================================================
FILE: README.md
================================================
# Sync

## [Download Releases](https://github.com/OsuSync/Sync/releases) , [UserGuide](https://github.com/Deliay/Sync/wiki/UserReadMe_en) , [Official Plugins](https://github.com/Deliay/SyncPlugin)
[QQ群](https://jq.qq.com/?_wv=1027&k=5y2CVZ6) / [Discord](https://discord.gg/KG86sWS)
----------------------------------
Sync your live chat to osu!~
[MIT License](LICENSE)
================================================
FILE: Sync/Client/ClientEvent.cs
================================================
using Sync.MessageFilter;
using Sync.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Client
{
/// <summary>
/// Singleton Client event dispathcher
/// </summary>
public class ClientEvents : BaseEventDispatcher<IClientEvent>
{
public readonly static ClientEvents Instance = new ClientEvents();
private ClientEvents()
{
EventDispatcher.Instance.RegisterNewDispatcher(GetType());
}
}
/// <summary>
/// Base client event interface flag
/// </summary>
public interface IClientEvent : IBaseEvent { }
/// <summary>
/// Fire when client start work (fire time decide by client)
/// </summary>
public struct ClientStartWorkEvent : IClientEvent
{
public ClientWorkWrapper Client { get => SyncHost.Instance.ClientWrapper; }
}
/// <summary>
/// Fire when client stop work
/// </summary>
public struct ClientStopWorkEvent : IClientEvent
{
}
/// <summary>
/// Fire when Client recive a IRCMessage
/// </summary>
public struct ClientOnMessageEvent : IClientEvent
{
public IRCMessage Message { get; }
public ClientOnMessageEvent(IRCMessage message)
{
Message = message;
}
}
}
================================================
FILE: Sync/Client/ClientManager.cs
================================================
using Sync.MessageFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Client
{
/// <summary>
/// The manager for Clients
/// </summary>
public class ClientManager
{
private LinkedList<DefaultClient> clients;
public IReadOnlyList<DefaultClient> Clients { get => clients.ToList(); }
public int Count { get => clients.Count; }
public static readonly ClientManager Instance = new ClientManager();
private ClientManager()
{
clients = new LinkedList<DefaultClient>();
}
public void AddAllClient(params DefaultClient[] clients)
{
foreach (var client in clients)
{
if (!this.clients.Contains(client))
{
this.clients.AddLast(client);
}
}
}
public bool AddClient(DefaultClient client)
{
if(clients.Contains(client))
{
return false;
}
else
{
clients.AddLast(client);
return true;
}
}
}
}
================================================
FILE: Sync/Client/ClientWorkWrapper.cs
================================================
using Sync.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Client
{
/// <summary>
/// A wrapper for Client instance switch and dispatch
/// </summary>
public class ClientWorkWrapper
{
public DefaultClient Client { get; internal set; }
private ClientManager clients;
public ClientWorkWrapper(ClientManager manager)
{
clients = manager;
ResetClient();
}
/// <summary>
/// Call when reload client form confiuration file
/// </summary>
public void ResetClient()
{
DefaultClient client = clients.Clients.FirstOrDefault(p => p.ClientName == DefaultConfiguration.Instance.Client);
if (Client != null && Client != client)
{
Client.SwitchOtherClient();
}
if (client == null)
{
if (clients.Count == 0) return;
client = clients.Clients.First();
}
Client = client;
Client.SwitchThisClient();
}
}
}
================================================
FILE: Sync/Client/DefaultReciveClient.cs
================================================
using Sync.MessageFilter;
using Sync.Plugins;
using Sync.Source;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Client
{
public abstract class DefaultClient
{
//Author and Client Name
public string Author { get; }
public string ClientName { get; }
public BaseEventDispatcher<IClientEvent> EventBus { get => ClientEvents.Instance; }
public string NickName { get; protected set; }
/// <summary>
/// Invoke while user switch to other client instance
/// </summary>
public abstract void SwitchOtherClient();
/// <summary>
/// Invoke while user switch to this instance
/// </summary>
public abstract void SwitchThisClient();
public DefaultClient(string Author, string Name)
{
this.Author = Author;
this.ClientName = Name;
}
/// <summary>
/// Raise event and pass messages
/// </summary>
/// <param name="msg">Bypass message</param>
protected void EnqueueMessage(IRCMessage msg)
{
EventBus.RaiseEvent(new ClientOnMessageEvent(msg));
}
public abstract void StartWork();
public abstract void StopWork();
public abstract void Restart();
public SourceStatus CurrentStatus { get; protected set; }
/// <summary>
/// SendMessage to Client
/// WARNING: SEND MESSAGE DIRECTLY WHIT THIS WILL NOT PASS BY FILTERS!
/// </summary>
/// <param name="message"></param>
public abstract void SendMessage(IMessageBase message);
}
}
================================================
FILE: Sync/Command/CommandDispatch.cs
================================================
using System;
using System.Collections.Generic;
namespace Sync.Command
{
/// <summary>
/// Delegate for one Command
/// </summary>
/// <param name="arg">Command args</param>
/// <returns></returns>
public delegate bool CommandDelegate(Arguments arg);
/// <summary>
/// A typedef for arguments list
/// </summary>
public class Arguments : List<string>
{
public Arguments()
{
}
public Arguments(params string[] args)
{
AddRange(args);
}
public static implicit operator Arguments(string[] args)
{
return new Arguments(args);
}
}
/// <summary>
/// A Hashmap command dispatcher
/// </summary>
public class CommandDispatch
{
private Dictionary<string, CommandDelegate> cmdList = new Dictionary<string, CommandDelegate>();
private Dictionary<string, string> cmdDest = new Dictionary<string, string>();
public int count
{
get { return cmdList.Count; }
}
/// <summary>
/// Bind command to string
/// </summary>
/// <param name="name">Invoke name</param>
/// <param name="func">Functor</param>
/// <param name="desc">Description</param>
/// <returns><see cref="true"/> success, <see cref="false"/> fail</returns>
public bool bind(string name, CommandDelegate func, string desc)
{
if (cmdList.ContainsKey(name)) return false;
cmdList.Add(name, func);
cmdDest.Add(name, desc);
return true;
}
public CommandDelegate get(string name)
{
if (cmdList.ContainsKey(name)) return cmdList[name];
else return null;
}
public IDictionary<string, string> getCommandsHelp()
{
return cmdDest;
}
public bool invoke(string name, Arguments args)
{
try
{
if (cmdList.ContainsKey(name)) return cmdList[name](args);
else return false;
}
catch(Exception e)
{
Tools.IO.CurrentIO.Write(e.Message);
Tools.IO.CurrentIO.Write(e.StackTrace);
Tools.IO.CurrentIO.Write(e.Source);
return false;
}
}
}
}
================================================
FILE: Sync/Command/CommandManager.cs
================================================
using Sync.Tools;
using static Sync.Tools.DefaultI18n;
using System;
namespace Sync.Command
{
/// <summary>
/// Command manager for plugins commands
/// </summary>
public class CommandManager
{
CommandDispatch dispatch;
public CommandManager()
{
dispatch = new CommandDispatch();
}
/// <summary>
/// Register command via this dispatch
/// </summary>
public CommandDispatch Dispatch
{
get { return dispatch; }
}
/// <summary>
/// Invoke command in string
/// </summary>
/// <param name="cmd">Command</param>
public void invokeCmdString(string cmd)
{
if (cmd == null || cmd.Length == 0) return;
string[] args = cmd.Split(" ".ToCharArray(), 2);
if(args.Length < 1 )
{
IO.CurrentIO.Write(LANG_UnknowCommand);
return;
}
string arg = string.Empty;
if (args.Length > 1) arg = args[1];
if (!dispatch.invoke(args[0], (arg == string.Empty ? new Arguments() : arg.Split(' '))))
{
IO.CurrentIO.Write(LANG_CommandFail);
}
}
}
}
================================================
FILE: Sync/Dependence/config.ini
================================================
[config]
LiveRoomID=0
TargetIRC=noname
BotIRC=noname
BotIRCPassword=password
Provider=BiliBili
================================================
FILE: Sync/Event/EventDispatcher.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Sync.Plugins
{
/// <summary>
/// Base event class
/// </summary>
public interface IBaseEvent
{
}
public class EventDispatcherTaskScheduler : TaskScheduler
{
private LinkedList<Task> tasks = new LinkedList<Task>();
protected override IEnumerable<Task> GetScheduledTasks()
{
return tasks;
}
protected override void QueueTask(Task task)
{
var thread = new Thread(() => { TryExecuteTask(task); });
thread.Start();
}
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
return TryExecuteTask(task);
}
}
public abstract class BaseEventDispatcher<T> where T : IBaseEvent
{
/// <summary>
/// private event for call
/// </summary>
/// <param name="eventType"></param>
/// <param name="insance"></param>
private void raiseEventAsync<Event>(Event insance) where Event : T
{
EventDispatcher.Instance.RaiseEventAsync(this.GetType(), insance);
}
private void raiseEvent<Event>(Event insance) where Event : T
{
EventDispatcher.Instance.RaiseEvent(this.GetType(), insance);
}
/// <summary>
/// public virtual for sub-classes override
/// </summary>
/// <typeparam name="Event"></typeparam>
/// <param name="event"></param>
public virtual void RaiseEventAsync<Event>(Event @event) where Event : T
{
raiseEventAsync(@event);
}
/// <summary>
/// public virtual for sub-classes override
/// </summary>
/// <typeparam name="Event"></typeparam>
/// <param name="event"></param>
public virtual void RaiseEvent<Event>(Event @event) where Event : T
{
raiseEvent(@event);
}
/// <summary>
/// regist class for event bind
/// </summary>
/// <typeparam name="Event"></typeparam>
/// <param name="handler"></param>
public void BindEvent<Event>(EventHandlerFunc<Event> handler) where Event : T
{
EventDispatcher.Instance.RegisterEventHandler(GetType(), handler);
}
}
/// <summary>
/// the generic handler impl
/// </summary>
/// <typeparam name="T">which typeof Event should handle</typeparam>
/// <param name="event">the event fired you target handler</param>
/// <returns></returns>
public delegate void EventHandlerFunc<Event>(Event @event) where Event : IBaseEvent;
public class HandlerList : LinkedList<object>
{
}
/// <summary>
/// typedef for LinkedList
/// </summary>
public class Dispatcher : Dictionary<Type, HandlerList>
{
}
/// <summary>
/// [Singleton] Global event dispatcher
/// </summary>
public class EventDispatcher
{
private Dictionary<Type, Dispatcher> dispatchers = new Dictionary<Type, Dispatcher>();
private TaskScheduler tasks = new EventDispatcherTaskScheduler();
private EventDispatcher()
{
}
public static readonly EventDispatcher Instance = new EventDispatcher();
/// <summary>
/// Register new event type[event dispatcher]
/// </summary>
/// <typeparam name="EventDispatcher">New dispatcher classes</typeparam>
/// <returns></returns>
public void RegisterNewDispatcher<EventDispatcher, TEvent>() where EventDispatcher : BaseEventDispatcher<TEvent> where TEvent : IBaseEvent
{
RegisterNewDispatcher(typeof(EventDispatcher));
}
/// <summary>
/// Register new event type
/// </summary>
/// <param name="t"></param>
public void RegisterNewDispatcher(Type t)
{
if (dispatchers.ContainsKey(t)) return;
else dispatchers.Add(t, new Dispatcher());
return;
}
/// <summary>
/// Get all binder of this event
/// </summary>
/// <typeparam name="Event">Target event</typeparam>
/// <param name="eventType">Event dispatcher</param>
/// <returns></returns>
public HandlerList GetHandlerList<Event>(Type eventType)
{
return GetHandlerList(eventType, typeof(Event));
}
/// <summary>
/// Get all binder of this event
/// </summary>
/// <param name="eventType">Event dispatcher</param>
/// <param name="event">Target event</param>
/// <returns></returns>
public HandlerList GetHandlerList(Type eventType, Type @event)
{
return GetDispatcher(eventType)[@event];
}
/// <summary>
/// Get dispathcer by type
/// </summary>
/// <param name="eventType">type</param>
/// <returns></returns>
public Dispatcher GetDispatcher(Type eventType)
{
return (dispatchers[eventType]);
}
/// <summary>
/// Get dispathcer by T
/// </summary>
/// <typeparam name="EventType">Type</typeparam>
/// <returns></returns>
public Dispatcher GetDispatcher<EventType>()
{
return (dispatchers[typeof(EventType)]);
}
/// <summary>
/// Return a dispathcer is or not exist
/// </summary>
/// <typeparam name="EventType"></typeparam>
/// <returns></returns>
public bool ExistDispatcher<EventType>()
{
return dispatchers.ContainsKey(typeof(EventType));
}
/// <summary>
/// Return a dispathcer is or not exit
/// </summary>
/// <param name="eventType"></param>
/// <returns></returns>
public bool ExistDispatcher(Type eventType)
{
return dispatchers.ContainsKey(eventType);
}
/// <summary>
/// Fire event with async call
/// </summary>
/// <typeparam name="EventType">Dispathcer</typeparam>
/// <typeparam name="Event">Event</typeparam>
/// <param name="event">Event instance</param>
internal void RaiseEventAsync<EventType, Event>(Event @event) where Event : IBaseEvent
{
RaiseEventAsync(typeof(EventType), @event);
}
/// <summary>
/// Fire event with async call
/// </summary>
/// <typeparam name="Event">Event</typeparam>
/// <param name="eventType">dispatcher</param>
/// <param name="event">event instance</param>
internal void RaiseEventAsync<Event>(Type eventType, Event @event) where Event : IBaseEvent
{
if (!GetDispatcher(eventType).ContainsKey(typeof(Event))) return;
foreach (var item in GetDispatcher(eventType)[typeof(Event)])
{
var p = ((EventHandlerFunc<Event>)(item));
Task.Run(() => p((@event)));
}
}
/// <summary>
/// Fire event with sync call
/// </summary>
/// <typeparam name="EventType">Event dispathcer</typeparam>
/// <typeparam name="Event">Event</typeparam>
/// <param name="event">Event instance</param>
internal void RaiseEvent<EventType, Event>(Event @event) where Event : IBaseEvent
{
RaiseEvent(typeof(EventType), @event);
}
/// <summary>
/// Fire event with sync call
/// </summary>
/// <typeparam name="Event">Event</typeparam>
/// <param name="eventType">dispatcher</param>
/// <param name="event">event instance</param>
internal void RaiseEvent<Event>(Type eventType, Event @event) where Event : IBaseEvent
{
Type typo = typeof(Event);
if (!GetDispatcher(eventType).ContainsKey(typo)) return;
foreach (var item in GetDispatcher(eventType)[typo])
{
((EventHandlerFunc<Event>)(item))(@event);
}
}
/// <summary>
/// Register event handler
/// </summary>
/// <typeparam name="Event">Target event</typeparam>
/// <param name="eventType">Dispatcher</param>
/// <param name="handler">handler</param>
/// <returns></returns>
public bool RegisterEventHandler<Event>(Type eventType, EventHandlerFunc<Event> handler) where Event : IBaseEvent
{
Type typo = typeof(Event);
Dispatcher dispatcher = null;
if (ExistDispatcher(eventType))
{
dispatcher = GetDispatcher(eventType);
}
else
{
throw new Exception("Dispatcher not register!");
}
if(!dispatcher.ContainsKey(typo))
{
dispatcher.Add(typo, new HandlerList());
}
if (dispatcher[typo].Contains(handler)) return false;
dispatcher[typo].AddLast(handler);
return true;
}
/// <summary>
/// Register event handle
/// </summary>
/// <typeparam name="EventType">Event dispathcer</typeparam>
/// <typeparam name="Event">Target Event</typeparam>
/// <param name="handler">Handler</param>
/// <returns></returns>
public bool RegisterEventHandler<EventType, Event>(EventHandlerFunc<Event> handler) where Event : IBaseEvent
{
return RegisterEventHandler(typeof(EventType), handler);
}
/// <summary>
/// Remove event handle
/// </summary>
/// <typeparam name="EventType">Event dispathcer</typeparam>
/// <typeparam name="Event">Target Event</typeparam>
/// <param name="handler">Handler</param>
public void RemoveEventHandler<EventType, Event>(EventHandlerFunc<Event> handler) where Event : IBaseEvent
{
if (dispatchers.TryGetValue(typeof(EventType),out Dispatcher dispatcher))
{
var list = dispatcher[typeof(Event)];
list.Remove(handler);
}
}
}
}
================================================
FILE: Sync/MessageFilter/FilterBase.cs
================================================
using System;
using Sync.Source;
using Sync.Tools;
using static Sync.Tools.DefaultI18n;
using Sync.Plugins;
namespace Sync.MessageFilter
{
/// <summary>
/// Base filter message
/// </summary>
public interface IMessageBase : IBaseEvent
{
StringElement User { get; set; }
StringElement Message { get; set; }
bool Cancel { get; set; }
}
/// <summary>
/// Online change event will raise this message
/// </summary>
public struct OnlineChangeMessage : IMessageBase
{
public StringElement User { get; set; }
public StringElement Message { get; set; }
public StringElement Name { get; set; }
public int Count { get; set; }
public bool Cancel { get; set; }
public OnlineChangeMessage(int count)
{
User = "";
Message = string.Format(LANG_Current_Online, count);
Name = "";
Cancel = false;
this.Count = count;
}
}
/// <summary>
/// GiftMessage event will raise this message
/// </summary>
public struct GiftMessage : IMessageBase
{
public StringElement User { get; set; }
public StringElement Message { get; set; }
public StringElement Name { get; set; }
public IBaseGiftEvent Source { get; }
public int Count { get; set; }
/// <summary>
/// cancel标志指示了这条来自弹幕的消息将不会同步到IRC。
/// </summary>
public bool Cancel { get; set; }
public GiftMessage(IBaseGiftEvent src)
{
this.User = src.SenderName;
this.Name = src.GiftName;
this.Count = src.GiftCount;
this.Source = src;
this.Message = string.Format(LANG_Gift_Sent, Count, Name);
Cancel = false;
}
}
/// <summary>
/// Normal danmaku event will raise this message
/// </summary>
public struct DanmakuMessage : IMessageBase
{
public StringElement User { get; set; }
public StringElement Message { get; set; }
/// <summary>
/// cancel标志指示了这条来自弹幕的消息将不会同步到IRC。
/// </summary>
public bool Cancel { get; set; }
public DanmakuMessage(IBaseDanmakuEvent src)
{
this.User = src.SenderName;
this.Message = src.Danmuku;
this.Cancel = false;
}
}
/// <summary>
/// Client Reccive event will raise this message
/// </summary>
public struct IRCMessage : IMessageBase
{
public StringElement User { get; set; }
public StringElement Message { get; set; }
/// <summary>
/// cancel标志指示了这条来自IRC的消息,不会同步到弹幕
/// </summary>
public bool Cancel { get; set; }
public IRCMessage(StringElement user, StringElement rawMessage)
{
this.User = user;
this.Message = rawMessage;
this.Cancel = false;
}
}
public interface ISourceOnlineChange
{
//just flag
}
public interface ISourceGift
{
//just flag
}
public interface ISourceDanmaku
{
//just flag
}
public interface ISourceClient
{
//just flag
}
public interface IFilter
{
void onMsg(ref IMessageBase msg);
}
}
================================================
FILE: Sync/MessageFilter/FilterManager.cs
================================================
using Sync.MessageFilter;
using Sync.Source;
using Sync.Tools;
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace Sync.Plugins
{
/// <summary>
/// Manager and filter message
/// </summary>
public class FilterManager : BaseEventDispatcher<IMessageBase>
{
Dictionary<Type, List<IFilter>> filters;
internal FilterManager()
{
filters = new Dictionary<Type, List<IFilter>>();
AddSource<ISourceClient>();
AddSource<ISourceDanmaku>();
AddSource<ISourceOnlineChange>();
AddSource<ISourceGift>();
EventDispatcher.Instance.RegisterNewDispatcher(GetType());
//Bind source event for Message Dispathcer
SourceEvents.Instance.BindEvent<IBaseDanmakuEvent>(evt => SyncHost.Instance.Messages.RaiseMessage<ISourceDanmaku>(new IRCMessage(evt.SenderName, evt.Danmuku)));
SourceEvents.Instance.BindEvent<BaseOnlineCountEvent>(evt =>
{
if (DefaultConfiguration.Instance.EnableViewersChangedNotify.ToBool())
SyncHost.Instance.Messages.RaiseMessage<ISourceOnlineChange>(new OnlineChangeMessage(evt.Count));
});
SourceEvents.Instance.BindEvent<IBaseGiftEvent>(evt =>
{
if (DefaultConfiguration.Instance.EnableGiftChangedNotify.ToBool())
SyncHost.Instance.Messages.RaiseMessage<ISourceClient>(new GiftMessage(evt));
});
}
private void AddSource<T>()
{
filters.Add(typeof(T), new List<IFilter>());
}
public IEnumerable<KeyValuePair<Type, IFilter>> GetFiltersEnum()
{
foreach (var list in filters)
{
foreach(var item in list.Value)
{
yield return new KeyValuePair<Type, IFilter>(list.Key, item);
}
}
}
public int Count { get { return filters.Sum(p => p.Value.Count); } }
internal void PassFilterDanmaku(ref IMessageBase msg)
{
PassFilter<ISourceDanmaku>(ref msg);
}
internal void PassFilterOSU(ref IMessageBase msg)
{
PassFilter<ISourceClient>(ref msg);
}
internal void PassFilterGift(ref IMessageBase msg)
{
PassFilter<ISourceGift>(ref msg);
}
internal void PassFilterOnlineChange(ref IMessageBase msg)
{
PassFilter<ISourceOnlineChange>(ref msg);
}
private void PassFilter<T>(ref IMessageBase msg)
{
PassFilter(typeof(T), ref msg);
}
private void PassFilter(Type identify, ref IMessageBase msg)
{
foreach (var filter in filters[identify])
{
filter.onMsg(ref msg);
if (msg.Cancel) //已经处理的就不用继续给后面的处理了
break;
}
RaiseEventAsync(msg);
}
public void AddFilter(IFilter filter)
{
foreach (var i in filter.GetType().GetInterfaces())
{
if(filters.ContainsKey(i))
{
filters[i].Add(filter);
filters[i].Sort((a,b)=> ((int)b.GetFilterPriority())- ((int)a.GetFilterPriority()));
}
}
}
public void deleteFilter(IFilter filter)
{
foreach (var i in filter.GetType().GetInterfaces())
{
if (filters.ContainsKey(i))
{
filters[i].Remove(filter);
}
}
}
public void AddFilters(params IFilter[] filters)
{
foreach (IFilter filter in filters)
{
AddFilter(filter);
}
}
}
}
================================================
FILE: Sync/MessageFilter/FilterPriorityAttribute.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.MessageFilter
{
public enum FilterPriority
{
Lowest=-2,
Low=-1,
Normal=0,
High=1,
Highest=2
}
[AttributeUsage(AttributeTargets.Class)]
public class FilterPriorityAttribute:Attribute
{
public FilterPriority Priority { get; set; } = FilterPriority.Normal;
}
public static class FilterPriorityAttributeExtension
{
public static FilterPriority GetFilterPriority(this IFilter filter)
{
var attr=filter.GetType().GetCustomAttributes(typeof(FilterPriorityAttribute),false).FirstOrDefault() as FilterPriorityAttribute;
return attr?.Priority ?? FilterPriority.Normal;
}
}
}
================================================
FILE: Sync/MessageFilter/MessageDispatcher.cs
================================================
using Sync.Client;
using Sync.MessageFilter;
using Sync.Source;
using Sync.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Plugins
{
public class MessageDispatcher
{
FilterManager filters;
internal MessageDispatcher(FilterManager f)
{
filters = f;
MessageManager.LimitLevel = 3;
MessageManager.Option = MessageManager.PeekOption.Auto;
MessageManager.Init(filters);
MessageManager.SetSendMessageAction(new MessageManager.SendMessageAction((target,message) =>{
SyncHost.Instance.ClientWrapper.Client.SendMessage(new IRCMessage(target, message));
}));
}
/// <summary>
/// Send danmaku message to osu!IRC
/// </summary>
/// <param name="danmaku">Danmaku</param>
public void onDanmaku(IBaseDanmakuEvent danmaku)
{
IMessageBase msg = new DanmakuMessage(danmaku);
RaiseMessage<ISourceDanmaku>(msg);
}
/// <summary>
/// Send osu!irc message to damaku
/// </summary>
/// <param name="user">Sender</param>
/// <param name="message">Message</param>
public void onIRC(StringElement user, StringElement message)
{
IMessageBase msg = new IRCMessage(user, message);
RaiseMessage<ISourceClient>(msg);
}
public void RaiseMessage<Source>(IMessageBase msg)
{
RaiseMessage(typeof(Source), msg);
}
/// <summary>
/// Raise a message and pass to filter list
/// </summary>
private void RaiseMessage(Type msgType, IMessageBase msg)
{
IMessageBase newMsg = msg;
//From danmaku
if (msgType == typeof(ISourceDanmaku))
{
filters.PassFilterDanmaku(ref newMsg);
if (newMsg.Cancel) return;
else
{
//Send this danmaku message to osu!irc
MessageManager.PostIRCMessage(SyncHost.Instance.ClientWrapper.Client.NickName, newMsg);
}
return;
}
//From osu!orc
else if (msgType == typeof(ISourceClient))
{
filters.PassFilterOSU(ref newMsg);
if (newMsg.Cancel) return;
else
{
//Detect sender is osu!irc self
if (newMsg.User.RawText == SyncHost.Instance.ClientWrapper.Client.NickName)
{
//Send message to danmaku source
if (!SyncHost.Instance.SourceWrapper.Sendable)
{
IO.CurrentIO.WriteColor(DefaultI18n.LANG_SendNotReady, ConsoleColor.Red);
}
else
{
SyncHost.Instance.SourceWrapper.SendableSource.Send(newMsg);
}
}
//Send message to irc if Not sender
else
{
MessageManager.PostIRCMessage(SyncHost.Instance.ClientWrapper.Client.NickName, newMsg);
}
}
return;
}
//From danmaku gift(subscribe or other gift)
else if (msgType == typeof(ISourceGift))
{
filters.PassFilterGift(ref newMsg);
if (newMsg.Cancel) return;
else
{
SyncHost.Instance.ClientWrapper.Client?.SendMessage(new IRCMessage(SyncHost.Instance.ClientWrapper.Client.NickName, newMsg.Message));
}
}
//The spectator count change
else if (msgType == typeof(ISourceOnlineChange))
{
filters.PassFilterOnlineChange(ref newMsg);
if (newMsg.Cancel) return;
else
{
SyncHost.Instance.ClientWrapper.Client?.SendMessage(new IRCMessage(SyncHost.Instance.ClientWrapper.Client.NickName, newMsg.Message));
}
}
}
}
}
================================================
FILE: Sync/MessageFilter/MessageManager.cs
================================================
using Sync.Plugins;
using Sync.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Sync.MessageFilter
{
/// <summary>
/// Message limiter
/// </summary>
public class MessageManager
{
private static float sendLimit_pre = 0;
private static int time_inv = 1000;
private static float time = 0;
private static float recoverTime = 60000;
private static SendFilter sendFilter = new SendFilter();
public static PeekOption Option { set; get; } = PeekOption.Auto;
private static Thread thread = null;
public static float RecoverTime
{
get { return recoverTime; }
}
public static int CurrentQueueCount
{
get { return MessageQueue.Count; }
}
private static float currentRecoverTime = 0;
private static Object lockObj = new object();
private static volatile int sendCount = 0;
public int CurrentCount
{
get
{
return sendCount;
}
}
private static int limitCount = 5;
public static int LimitLevel
{
get { return limitCount; }
set
{
limitCount = value;
sendLimit_pre = (float)limitCount / (60000 / time_inv);
}
}
private static volatile bool isLimit = false;
public static bool IsLimit
{
get
{
return isLimit;
}
}
private static SendMessageAction action;
private static List<MessageBaseWrapper> MessageQueue = new List<MessageBaseWrapper>();
private struct MessageBaseWrapper
{
public DateTime time;
public string target;
public IMessageBase message;
}
private class SendFilter : IFilter, ISourceDanmaku
{
public void onMsg(ref IMessageBase msg)
{
switch (Option)
{
case PeekOption.ForceAll://还要过滤可能存在的?前缀
break;
case PeekOption.DisableAll:
msg.Cancel = true;
return;
case PeekOption.OnlySendCommand:
if (!msg.Message.RawText.StartsWith("?send"))
{
msg.Cancel = true;
return;
}
break;
case PeekOption.Auto:
if (IsLimit && (!msg.Message.RawText.StartsWith("?send")))
{
msg.Cancel = true;
return;
}
break;
default:
break;
}
if (msg.Message.RawText.StartsWith("?send "))
msg.Message = new StringElement(msg.Message.RawText.Remove(0, 5));
}
}
public enum PeekOption
{
ForceAll,
DisableAll,
OnlySendCommand,
Auto
}
public static void Init(FilterManager manager)
{
thread = new Thread(runThread);
SyncHost.Instance.Filters.AddFilter(sendFilter);
thread.Start();
}
public static void PostIRCMessage(string target, IMessageBase message)
{
lock (lockObj)
{
MessageQueue.Add(new MessageBaseWrapper() {
time=DateTime.Now,
target=target,
message =message
});
sendCount++;
}
}
public static void SetOption(string optionName)
{
if (Enum.TryParse(optionName, true, out PeekOption peekOption))
Option = peekOption;
else
Option = PeekOption.Auto;
}
public delegate void SendMessageAction(string userName, string message);
public static void SetSendMessageAction(SendMessageAction action)
{
MessageManager.action = action;
}
public static void SendMessage(string userName, string message)
{
action(userName, message);
}
private static void runThread(object state)
{
StringBuilder sb=new StringBuilder();
while (true)
{
Thread.Sleep(time_inv);
sb.Clear();
time = time + time_inv;
if (Option == PeekOption.Auto)
{
//Exceeded limit?
if (!isLimit && (float)sendCount / (60000.0f / time_inv) >= sendLimit_pre)
{
isLimit = true;
IO.CurrentIO.WriteColor("isLimit is true now", ConsoleColor.Yellow);
currentRecoverTime = 0;
}
//unlimit time
currentRecoverTime += isLimit ? time_inv : 0;
if (currentRecoverTime >= recoverTime)
{
currentRecoverTime = 0;
isLimit = false;
IO.CurrentIO.WriteColor("isLimit is false now", ConsoleColor.Yellow);
}
}
sendCount = 0;
if (isLimit)
{
lock (lockObj)
{
while (MessageQueue.Count != 0)
{
var message = MessageQueue[0];
MessageQueue.RemoveAt(0);
if (message.message == null)
break;
sb.AppendFormat("{0}:{1} || ", message.message.User, message.message.Message.RawText);
}
}
if (sb.Length != 0)
SendMessage("", sb.ToString());
}
else
{
if (MessageQueue.Count != 0)
{
var message = MessageQueue[0];
MessageQueue.RemoveAt(0);
SendMessage(message.target, message.message.User + message.message.Message.ToString());
}
}
}
}
}
}
================================================
FILE: Sync/Plugins/Plugin.cs
================================================
using Sync.Command;
using System;
using System.Reflection;
namespace Sync.Plugins
{
public abstract class Plugin
{
public readonly string Name;
public readonly string Author;
public BaseEventDispatcher<IPluginEvent> EventBus { get => PluginEvents.Instance; }
public Plugin(string Name, string Author)
{
this.Name = Name;
this.Author = Author;
}
protected SyncHost getHoster()
{
return SyncHost.Instance;
}
public string getName()
{
return Name;
}
public string getAuthor()
{
return Author;
}
public string getGuid()
{
return this.GetType().GetCustomAttribute<SyncPluginID>()?.GUID;
}
public override string ToString()
{
return Name;
}
public virtual void OnDisable()
{
}
public virtual void OnEnable()
{
}
public virtual void OnExit()
{
}
}
}
================================================
FILE: Sync/Plugins/PluginManager.cs
================================================
using Sync.Client;
using Sync.Command;
using Sync.Source;
using Sync.Tools;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using static Sync.Tools.DefaultI18n;
namespace Sync.Plugins
{
/// <summary>
/// A flag for plugin event type
/// </summary>
public interface IPluginEvent : IBaseEvent { }
/// <summary>
/// Base plugin events
/// </summary>
public class PluginEvents : BaseEventDispatcher<IPluginEvent>
{
/// <summary>
/// Fire when init plugin
/// </summary>
public struct InitPluginEvent : IPluginEvent
{
public Plugin Plugin { get; private set; }
public InitPluginEvent(Plugin plugin)
{
this.Plugin = plugin;
}
}
/// <summary>
/// Fire when init source
/// </summary>
public struct InitSourceEvent : IPluginEvent
{
public SourceManager Sources { get; private set; }
public InitSourceEvent(SourceManager source)
{
Sources = source;
}
}
/// <summary>
/// Fire when init filter
/// </summary>
public struct InitFilterEvent : IPluginEvent
{
public FilterManager Filters { get; private set; }
public InitFilterEvent(FilterManager filters)
{
Filters = filters;
}
}
/// <summary>
/// Fire when init command
/// </summary>
public struct InitCommandEvent : IPluginEvent
{
public CommandManager Commands { get; private set; }
public InitCommandEvent(CommandManager commands)
{
Commands = commands;
}
}
/// <summary>
/// Fire when init clients
/// </summary>
public struct InitClientEvent : IPluginEvent
{
public ClientManager Clients { get; private set; }
public InitClientEvent(ClientManager clients)
{
Clients = clients;
}
}
/// <summary>
/// Fire when init source warpper
/// </summary>
public struct InitSourceWarpperEvent : IPluginEvent
{
public SourceWorkWrapper SourceWrapper { get; private set; }
public InitSourceWarpperEvent(SourceWorkWrapper wrapper)
{
SourceWrapper = wrapper;
}
}
/// <summary>
/// Fire when init client warpper
/// </summary>
public struct InitClientWarpperEvent : IPluginEvent
{
public ClientWorkWrapper ClientWrapper { get; private set; }
public InitClientWarpperEvent(ClientWorkWrapper wrapper)
{
ClientWrapper = wrapper;
}
}
/// <summary>
/// Fire when load complete
/// </summary>
public struct LoadCompleteEvent : IPluginEvent
{
public SyncHost Host { get; private set; }
public LoadCompleteEvent(SyncHost host)
{
Host = host;
}
}
public struct ConfigurationChange : IPluginEvent
{
}
/// <summary>
/// Fire when ready
/// </summary>
public struct ProgramReadyEvent : IPluginEvent
{
//public SyncManager Manager { get; private set; }
//public SyncManagerCompleteEvent()
//{
// Manager = Program.host.SyncInstance;
//}
}
public static readonly PluginEvents Instance = new PluginEvents();
private PluginEvents()
{
EventDispatcher.Instance.RegisterNewDispatcher(GetType());
}
}
/// <summary>
/// Plugins Manager
/// <para>Load plugins from Plugins foldere and Initial plugin</para>
/// </summary>
public class PluginManager
{
private List<Plugin> pluginList;
private List<Assembly> asmList;
private LinkedList<Type> loadedList;
private List<Type> allList;
internal PluginManager()
{
}
/// <summary>
/// Raise global <see cref="PluginEvents.InitCommandEvent"/> to all plugin
/// </summary>
/// <returns>Return commands count</returns>
internal int LoadCommnads()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitCommandEvent(SyncHost.Instance.Commands));
return SyncHost.Instance.Commands.Dispatch.count;
}
/// <summary>
/// Raise global <see cref="PluginEvents.InitSourceEvent"/> to all plugin
/// </summary>
/// <returns>Return source count</returns>
internal int LoadSources()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitSourceEvent(SyncHost.Instance.Sources));
return SyncHost.Instance.Sources.SourceList.Count();
}
/// <summary>
/// Raise global <see cref="PluginEvents.InitFilterEvent"/> to all plugin
/// </summary>
/// <returns>Return filter count</returns>
internal int LoadFilters()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitFilterEvent(SyncHost.Instance.Filters));
return SyncHost.Instance.Filters.Count;
}
/// <summary>
/// Raise global <see cref="PluginEvents.InitClientEvent"/> to all plugin
/// </summary>
/// <returns></returns>
internal int LoadClients()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitClientEvent(SyncHost.Instance.Clients));
return SyncHost.Instance.Clients.Count;
}
/// <summary>
/// Raise global <see cref="PluginEvents.ProgramReadyEvent"/> to all plugin
/// </summary>
internal void ReadySync()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.ProgramReadyEvent());
}
/// <summary>
/// Get a <see cref="IEnumerable{T}"/> for plugin list
/// </summary>
/// <returns></returns>
public IEnumerable<Plugin> GetPlugins()
{
return pluginList;
}
/// <summary>
/// Internal get plugin list
/// </summary>
/// <returns></returns>
internal List<Plugin> GetPluginList()
{
return pluginList;
}
/// <summary>
/// Raise a <see cref="PluginEvents.LoadCompleteEvent"/> to all plugin
/// </summary>
internal void ReadyProgram()
{
PluginEvents.Instance.RaiseEvent(new PluginEvents.LoadCompleteEvent(SyncHost.Instance));
}
/// <summary>
/// Initial and load all support Plugin in 'Plugins' folder
/// </summary>
/// <returns>Plugins count</returns>
internal int LoadPlugins()
{
//Combine search path
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
//Current plugins list
pluginList = new List<Plugin>();
//Loaded assembly
asmList = new List<Assembly>();
//Pre-add all assemblies in current AppDomain
asmList.AddRange(AppDomain.CurrentDomain.GetAssemblies());
//create Plugins folder if not exist
if (!Directory.Exists(path))
{
try
{
Directory.CreateDirectory(path);
IO.CurrentIO.WriteColor($"Created default Plugins folder : {path}", ConsoleColor.Green);
}
catch (Exception e)
{
IO.CurrentIO.WriteColor($"Create default Plugins folder ({path}) failed : {e.Message} ", ConsoleColor.Yellow);
}
}
//Change directiory to Plugins
Directory.SetCurrentDirectory(path);
//create cache folder
var rootCache = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cache");
string cache = Path.Combine(rootCache, $"cache_{(new Random()).Next().ToString("x8")}");
try
{
Directory.Delete(rootCache, true);
Directory.CreateDirectory(rootCache);
} catch { }
try
{
if (Directory.Exists(cache))
{
Directory.Delete(cache, true);
}
Directory.CreateDirectory(cache);
}
catch (Exception e)
{
IO.CurrentIO.WriteColor($"Create temporary cache folder ({cache}) failed : {e.Message} ", ConsoleColor.Yellow);
throw e;
}
new DirectoryInfo(rootCache)
{
Attributes = FileAttributes.Normal
};
//error extra notify mark
bool got_locked_error = false;
//Search all .dll files in directory(include sub directory)
foreach (string file in Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories))
{
try
{
if (asmList.Any(a => a.Location == file))
continue;
//Load assembly directly
string temp = Path.Combine(cache, Path.GetFileName(file));
File.Copy(file, temp);
Assembly asm = Assembly.LoadFrom(temp);
asmList.Add(asm);
}
catch (BadImageFormatException)
{
/*
* Do not output anything when the file is not a
* .Net assembly.
* This can reduces unnecessary output when
* unmanaged assembly is needed.
*/
}
catch (Exception e)
{
//Not a .NET Assembly DLL
IO.CurrentIO.WriteColor(String.Format(LANG_LoadPluginErr, file, e.Message), ConsoleColor.Red);
if (e.Message.Contains("0x80131515"))
got_locked_error = true;
}
}
if (got_locked_error)
IO.CurrentIO.WriteColor(String.Format("Opps,It seems your plugin dll files were locked by System.\n" +
"Please view https://osu.ppy.sh/forum/t/685031/start=37 and https://osu.ppy.sh/forum/t/685031/start=24 to solve problem."), ConsoleColor.Red);
loadedList = new LinkedList<Type>();
//To slove plugin dependency,
List<Type> lazylist = new List<Type>();
allList = new List<Type>();
//Load all plugins first
foreach (Assembly asm in asmList)
{
try
{
foreach (Type item in asm.GetExportedTypes())
{
Type it = asm.GetType(item.FullName);
if (it == null ||
!it.IsClass || !it.IsPublic ||
!typeof(Plugin).IsAssignableFrom(it) ||
typeof(Plugin) == it)
continue;
allList.Add(it);
}
}
catch (FileNotFoundException e)
{
CheckUnknownDependency(e.FileName.Substring(0, e.FileName.IndexOf(",") - 1));
}
catch (Exception e)
{
//Not up to date
IO.CurrentIO.WriteColor(String.Format(LANG_LoadPluginErr, asm.FullName, e.Message), ConsoleColor.Red);
continue;
}
}
lazylist = allList.ToList();
//looping add for resolve dependency
do
{
lazylist = layerLoader(lazylist);
} while (lazylist.Count != 0);
return pluginList.Count;
}
/// <summary>
/// Load plugins
/// <para>Load dependencies plugin first</para>
/// </summary>
/// <param name="asmList">All <see cref="T"/> : <see cref="Plugin"/></param>
/// <returns>Not loaded plugins</returns>
private List<Type> layerLoader(IList<Type> asmList)
{
List<Type> nextLoad = new List<Type>();
foreach (Type it in asmList)
{
try
{
var hardDeps = it.GetCustomAttributes<SyncPluginDependency>();
foreach (var item in hardDeps)
{
var target = allList.Select(p => p.GetCustomAttribute<SyncPluginID>())?.FirstOrDefault(p => p?.GUID == item.GUID);
if (item.Require && target == null) CheckGUIDUpdate(item);
if (item.Version == null) continue;
if (!CompareVersion(item.Version, target.Version)) CheckGUIDUpdate(item);
}
var softDeps = it.GetCustomAttributes<SyncSoftRequirePlugin>();
foreach (var item in softDeps)
{
foreach (var dep in item.RequirePluguins)
{
if (!allList.Any(p => p.Name.Contains(dep) || dep.Contains(p.Name))) CheckUnknownDependency(dep);
}
}
if (LateLoad(it))
{
#if (DEBUG)
IO.CurrentIO.WriteColor($"Lazy load [{it.Name}]", ConsoleColor.Green);
#endif
nextLoad.Add(it);
//Dependency load at this time
//Lazy load this plugin at next time
continue;
}
//no dependencies or dependencies all was loaded
if (!it.IsSubclassOf(typeof(Plugin))) continue;
else
{
LoadPluginFormType(it);
loadedList.AddLast(it);
}
}
catch (Exception e)
{
IO.CurrentIO.WriteColor(String.Format(LANG_NotPluginErr, it.Name, e.Message), ConsoleColor.Red);
IO.CurrentIO.WriteColor(e.StackTrace, ConsoleColor.Red);
continue;
}
}
return nextLoad;
}
private bool LateLoad(Type a)
{
SyncRequirePlugin requireAttr = a.GetCustomAttribute<SyncRequirePlugin>();
SyncSoftRequirePlugin softRequirePlugin = a.GetCustomAttribute<SyncSoftRequirePlugin>();
IEnumerable<SyncPluginDependency> deps = a.GetCustomAttributes<SyncPluginDependency>();
SyncPluginID pid = a.GetCustomAttribute<SyncPluginID>();
if (deps != null)
{
foreach (var item in deps)
{
if (loadedList.Any(p => p.GetCustomAttribute<SyncPluginID>()?.GUID == item.GUID)) continue;
else
{
if (CheckIsReferenceTo(allList.FirstOrDefault(p => p.GetCustomAttribute<SyncPluginID>()?.GUID == item.GUID), pid?.GUID)) return false;
else return true;
}
}
}
if (requireAttr != null)
{
foreach (var item in requireAttr.RequirePluguins)
{
//Dependency was been loaded
if (loadedList.Contains(item)) continue;
else
{
//Check cycle reference
if (CheckIsReferenceTo(item, a)) return false;
else return true;
}
}
}
if (softRequirePlugin != null)
{
foreach (var item in softRequirePlugin.RequirePluguins)
{
Type s = allList.FirstOrDefault(p => p.Name == item);
if (s == null)
{
continue;
}
else
{
if (CheckIsReferenceTo(s, a)) return false;
if (!loadedList.Contains(s)) return true;
}
}
}
return false;
}
private bool CheckIsReferenceTo(Type a, string b)
{
var result = a.GetCustomAttributes<SyncPluginDependency>()?.Any(p => p.GUID == b);
if (result.HasValue) return result.Value;
else return false;
}
private bool CheckIsReferenceTo(Type a, Type b)
{
return CheckIsHardReferenceTo(a, b) || CheckIsSoftReferenceTo(a, b.Name);
}
private bool CheckIsHardReferenceTo(Type a, Type b)
{
SyncRequirePlugin refRequireCheck = a.GetCustomAttribute<SyncRequirePlugin>();
if (refRequireCheck == null) return false;
return refRequireCheck.RequirePluguins.Contains(b);
}
private bool CheckIsSoftReferenceTo(Type a, string b)
{
SyncSoftRequirePlugin refRequireCheck = a.GetCustomAttribute<SyncSoftRequirePlugin>();
if (refRequireCheck == null) return false;
return refRequireCheck.RequirePluguins.Contains(b);
}
/// <summary>
/// True if <paramref name="b"/> is satisfy for the require of <paramref name="a"/>
/// </summary>
/// <param name="a">A version require</param>
/// <param name="b">Target version</param>
/// <returns></returns>
public static bool CompareVersion(string a, string b)
{
// v : less or equal
// x : must
// ^ : large or equal
char start = a[0];
Func<bool?, bool> converter;
if (start == 'v') converter = p => p == null || p.Value;
else if (start == '^') converter = p => p == null || !p.Value;
else converter = p => p == null;
string ta = a.Substring(1);
var va = ta.Split('.').Select(k => int.Parse(k)).ToArray();
var vb = b.Split('.').Select(k => int.Parse(k)).ToArray();
for (int i = 0; i < va.Length; i++)
{
bool val = va[i] > vb[i];
if (va[i] == vb[i]) continue;
else return converter(val);
}
return converter(null);
}
private void CheckUnknownDependency(string name)
{
if (Updater.update.InstallByKeyword(name, false))
{
SyncHost.Instance.ForceRestartSync();
throw new SyncPluginOutdateException($"Need restart application to update {name}");
}
else
{
throw new SyncMissingPluginException($"Can't install dependency plugin: {name}");
}
}
private void CheckGUIDUpdate(SyncPluginDependency item)
{
if (Updater.update.InternalUpdate(item.GUID, true))
{
SyncHost.Instance.ForceRestartSync();
throw new SyncPluginOutdateException($"Need restart application to update {item.GUID}");
}
else
{
throw new SyncMissingPluginException($"Can't install dependency plugin: {item.GUID}, version {item.Version}");
}
}
private Plugin LoadPluginFormType(Type it)
{
object pluginTest = it.Assembly.CreateInstance(it.FullName);
if (pluginTest == null)
{
throw new NullReferenceException("Create instance fail!");
}
Plugin plugin = (Plugin)pluginTest;
IO.CurrentIO.WriteColor(String.Format(LANG_LoadingPlugin, plugin.Name), ConsoleColor.White);
pluginList.Add(plugin);
plugin.OnEnable();
PluginEvents.Instance.RaiseEventAsync(new PluginEvents.InitPluginEvent(plugin));
return plugin;
}
}
public class SyncMissingPluginException : Exception
{
public SyncMissingPluginException(string msg) : base(msg)
{
}
}
public class SyncPluginOutdateException : Exception
{
public SyncPluginOutdateException(string msg) : base(msg)
{
}
}
/// <summary>
/// Using this attribute when you want load some plugin before your plugin.
/// </summary>
public class SyncRequirePlugin : Attribute
{
public IReadOnlyList<Type> RequirePluguins;
public SyncRequirePlugin(params Type[] types)
{
RequirePluguins = new List<Type>(types);
}
}
/// <summary>
/// Using this attribute when you dependence some plugin without hard link.
/// </summary>
public class SyncSoftRequirePlugin : Attribute
{
public IReadOnlyList<string> RequirePluguins;
public SyncSoftRequirePlugin(params string[] types)
{
RequirePluguins = new List<string>(types);
}
}
public class SyncPluginID : Attribute
{
public string GUID { get; }
/// <summary>
/// Major.Minjor.Reversion
/// <para>e.g: 1.4.5</para>
/// </summary>
public string Version { get; }
public SyncPluginID(string GUID, string Version)
{
this.Version = Version;
this.GUID = GUID;
}
}
public class SyncPluginDependency : Attribute
{
public string GUID { get; }
public string Version { get; set; }
public bool Require { get; set; }
public SyncPluginDependency(string guid) => GUID = guid;
}
}
================================================
FILE: Sync/Program.cs
================================================
using SharpRaven;
using Sync.Tools;
using System;
using System.Threading;
namespace Sync
{
public static class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
(new StartupHelper(args)).Start();
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
SentryHelper.Instance.RepoterError(e.ExceptionObject as Exception);
Thread.Sleep(2000);
Environment.Exit(1);
}
}
}
================================================
FILE: Sync/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Sync!")]
[assembly: AssemblyDescription("Sync Live danmaku and Games!")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Remilia")]
[assembly: AssemblyProduct("Sync")]
[assembly: AssemblyCopyright("MIT")]
[assembly: AssemblyTrademark("RemiliaScarlet.com")]
[assembly: AssemblyCulture("")]
//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
//若要开始生成可本地化的应用程序,请
//<PropertyGroup> 中的 .csproj 文件中
//例如,如果您在源文件中使用的是美国英语,
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
//对以下 NeutralResourceLanguage 特性的注释。 更新
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
//(当资源未在页面
//或应用程序资源字典中找到时使用)
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
//(当资源未在页面
//、应用程序或任何主题专用资源字典中找到时使用)
)]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.18.5.0")]
[assembly: AssemblyFileVersion("2.18.5.0")]
================================================
FILE: Sync/Properties/Resources.Designer.cs
================================================
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Sync.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Sync.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
================================================
FILE: Sync/Properties/Resources.resx
================================================
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
================================================
FILE: Sync/Properties/Settings.Designer.cs
================================================
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Sync.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
================================================
FILE: Sync/Properties/Settings.settings
================================================
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
================================================
FILE: Sync/Resources/App.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup>
</configuration>
================================================
FILE: Sync/Source/SourceBase.cs
================================================
using Sync.MessageFilter;
using Sync.Plugins;
using Sync.Tools;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Sync.Source
{
/// <summary>
/// Flag this source is support send
/// </summary>
public abstract class SendableSource : SourceBase
{
//if sendablesource is able send message now.
public virtual bool SendStatus { get => Status == SourceStatus.CONNECTED_WORKING; }
public SendableSource(string Name, string Author) : base(Name, Author)
{
}
internal void login(string user, string password)
{
Login(user, password);
}
public abstract void Login(string user, string password);
public abstract void Send(IMessageBase message);
}
/// <summary>
/// base class help program manager the source impl in program dispatch
/// </summary>
public abstract class SourceBase
{
public string Name { get; private set; }
public string Author { get; private set; }
public string LiveID { get; set; } = "";
public BaseEventDispatcher<ISourceEvent> EventBus { get => SourceEvents.Instance; }
public SourceStatus Status { get; protected set; }
public SourceBase(string Name, string Author)
{
this.Name = Name;
this.Author = Author;
this.Status = SourceStatus.IDLE;
}
/// <summary>
/// Raise a event synchronized and dispatch it to handler asynchronized
/// </summary>
/// <typeparam name="T">Target Event Type</typeparam>
/// <param name="args">Type args</param>
protected void RaiseEvent<T>(T args) where T : ISourceEvent
{
EventBus.RaiseEvent(args);
}
internal void connect()
{
this.Status = SourceStatus.USER_REQUEST_CONNECT;
Connect();
}
internal void disconnect()
{
this.Status = SourceStatus.USER_REQUEST_DISCONNECT;
Disconnect();
}
public abstract void Connect();
public abstract void Disconnect();
}
///// <summary>
///// fire when Source event raised.
///// </summary>
///// <param name="args"></param>
////public delegate void SourceEventEvt<T>(T args) where T : SourceEvent;
///// <summary>
///// Source event base arg class
///// Including event name and eventobject
///// </summary>
//public class SourceEventArgs<T> where T : SourceEvent
//{
// private SourceEvent eventObj;
// public string Name { get; private set; }
// public T EventObject { get => (T)eventObj; }
// public SourceEventArgs(T EventObject)
// {
// eventObj = EventObject;
// }
// public T CastTo()
// {
// return (T)EventObject;
// }
//}
/// <summary>
/// Source network impossible status
/// </summary>
public enum SourceStatus
{
/// <summary>
/// Source working good, still working
/// </summary>
CONNECTED_WORKING,
/// <summary>
/// Source working good, but waiting for remote server
/// </summary>
CONNECTED_WAITING,
/// <summary>
/// Still establish connection to target server
/// </summary>
CONNECTING,
/// <summary>
/// disconnect by remote
/// </summary>
REMOTE_DISCONNECTED,
/// <summary>
/// disconnect by user or network drop
/// </summary>
USER_DISCONNECTED,
/// <summary>
/// no any connection action
/// </summary>
IDLE,
/// <summary>
/// user request connect and waiting for Source class response.
/// </summary>
USER_REQUEST_CONNECT,
/// <summary>
/// user request disconnect, and waiting for Source class response.
/// </summary>
USER_REQUEST_DISCONNECT,
}
}
================================================
FILE: Sync/Source/SourceEvent.cs
================================================
using Sync.Client;
using Sync.MessageFilter;
using Sync.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Source
{
/// <summary>
/// Singleton for source events
/// </summary>
public sealed class SourceEvents : BaseEventDispatcher<ISourceEvent>
{
public readonly static SourceEvents Instance = new SourceEvents();
private SourceEvents()
{
EventDispatcher.Instance.RegisterNewDispatcher(GetType());
}
}
/// <summary>
/// This message will fire when source start work
/// </summary>
public struct StartSourceEvent : ISourceEvent
{
public SourceWorkWrapper Source { get => SyncHost.Instance.SourceWrapper; }
}
/// <summary>
/// This message will fire when source stop work
/// </summary>
public struct StopSyncEvent : ISourceEvent
{
}
/// <summary>
/// The message will fire when source recive a danmaku
/// </summary>
public struct BaseDanmakuEvent : IBaseDanmakuEvent
{
public string Danmuku { get; set; }
public string SenderName { get; set; }
public string SendTime { get; set; }
public BaseDanmakuEvent(string danmaku, string sender, string time)
{
Danmuku = danmaku;
SenderName = sender;
SendTime = time;
}
}
/// <summary>
/// Base danmaku interface
/// </summary>
public interface IBaseDanmakuEvent : ISourceEvent
{
string Danmuku { get; set; }
string SenderName { get; set; }
string SendTime { get; set; }
}
/// <summary>
/// Base gift interface
/// </summary>
public interface IBaseGiftEvent : ISourceEvent
{
string GiftName { get; set; }
int GiftCount { get; set; }
string SenderName { get; set; }
string SendTime { get; set; }
}
/// <summary>
/// This event will fire when source status change
/// </summary>
public struct BaseStatusEvent : ISourceEvent
{
public SourceStatus Status { get; private set; }
public BaseStatusEvent(SourceStatus status)
{
Status = status;
}
}
/// <summary>
/// This event will fire when source check online change
/// </summary>
public struct BaseOnlineCountEvent : ISourceEvent
{
public int Count { get; set; }
public BaseOnlineCountEvent(int Count)
{
this.Count = Count;
}
}
/// <summary>
/// Source event flag
/// </summary>
public interface ISourceEvent : IBaseEvent
{
}
}
================================================
FILE: Sync/Source/SourceManager.cs
================================================
using Sync.Source;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sync.Plugins
{
/// <summary>
/// Source manager
/// </summary>
public class SourceManager
{
LinkedList<SourceBase> listSources;
public SourceManager()
{
listSources = new LinkedList<SourceBase>();
}
public IEnumerable<SourceBase> SourceList
{
get
{
return listSources;
}
}
public bool AddSource(SourceBase src)
{
if(listSources.Contains(src))
{
return false;
}
else
{
listSources.AddLast(src);
}
return true;
}
}
}
================================================
FILE: Sync/Source/SourceWorkWrapper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sync.Plugins;
using Sync.Tools;
using static Sync.Tools.DefaultI18n;
namespace Sync.Source
{
/// <summary>
/// A wrapper for select source and check source senable
/// </summary>
public class SourceWorkWrapper
{
private SourceManager sources;
public bool Sendable { get; }
public SourceWorkWrapper(SourceManager sources)
{
this.sources = sources;
Source = sources.SourceList.Where(p => p.Name == DefaultConfiguration.Instance.Source).FirstOrDefault()??sources.SourceList.FirstOrDefault();/*没有的话就默认第一个*/
if(Source == null)
{
IO.CurrentIO.WriteColor(LANG_NO_ANY_SOURCE, ConsoleColor.Red);
}
if (Source is SendableSource)
{
SendableSource = (SendableSource)Source;
Sendable = true;
}
}
public SourceBase Source { get; internal set; }
public SendableSource SendableSource { get; internal set; }
}
}
================================================
FILE: Sync/Sync.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{FBD514C2-2830-479E-B050-D1C383028456}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Sync</RootNamespace>
<AssemblyName>Sync</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<TargetFrameworkProfile />
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Release\</OutputPath>
<DefineConstants>TRACE;SyncRelease</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>0</WarningLevel>
<Prefer32Bit>true</Prefer32Bit>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<CodeAnalysisIgnoreGeneratedCode>true</CodeAnalysisIgnoreGeneratedCode>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup>
<StartupObject>Sync.Program</StartupObject>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Resources\SyncIcon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup />
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SharpRaven, Version=2.4.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SharpRaven.2.4.0\lib\net45\SharpRaven.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<Compile Include="Client\ClientEvent.cs" />
<Compile Include="Client\ClientManager.cs" />
<Compile Include="Client\ClientWorkWrapper.cs" />
<Compile Include="Client\DefaultReciveClient.cs" />
<Compile Include="Command\CommandManager.cs" />
<Compile Include="MessageFilter\FilterBase.cs" />
<Compile Include="Event\EventDispatcher.cs" />
<Compile Include="MessageFilter\FilterManager.cs" />
<Compile Include="MessageFilter\FilterPriorityAttribute.cs" />
<Compile Include="MessageFilter\MessageDispatcher.cs" />
<Compile Include="MessageFilter\MessageManager.cs" />
<Compile Include="Tools\SentryHelper.cs" />
<Compile Include="Tools\StartupArgument.cs" />
<Compile Include="Tools\StartupHelper.cs" />
<Compile Include="Tools\Builtin\CommonCommand.cs" />
<Compile Include="Tools\ConfigurationAttribute\BaseConfigurationAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\ClientAndSourceAttribute.cs" />
<Compile Include="Tools\CommandParser.cs" />
<Compile Include="Tools\Builtin\PluginCommand.cs" />
<Compile Include="Tools\Builtin\InternalPlugin.cs" />
<Compile Include="Tools\ConfigurationAttribute\ConfigurationHolderAttribute.cs" />
<Compile Include="Tools\SyncIO\FileLoggerWriter.cs" />
<Compile Include="Tools\SyncIO\IOWrapper.cs" />
<Compile Include="Tools\SyncIO\NConsoleWriter.cs" />
<Compile Include="Tools\Updater.cs" />
<Compile Include="Plugins\Plugin.cs" />
<Compile Include="Plugins\PluginManager.cs" />
<Compile Include="Source\SourceManager.cs" />
<Compile Include="Source\SourceEvent.cs" />
<Compile Include="Source\SourceWorkWrapper.cs" />
<Compile Include="SyncHost.cs" />
<Compile Include="Source\SourceBase.cs" />
<Compile Include="Program.cs" />
<Compile Include="Command\CommandDispatch.cs" />
<Compile Include="Tools\ConfigurationAttribute\BoolAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\ColorAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\GuiLanguageElement.cs" />
<Compile Include="Tools\ConfigurationAttribute\FloatAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\FontAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\IntegerAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\ListAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\PathAttribute.cs" />
<Compile Include="Tools\ConfigurationAttribute\StringAttribute.cs" />
<Compile Include="Tools\Configuration.cs" />
<Compile Include="Tools\ConfigurationIO.cs" />
<Compile Include="Tools\SyncIO\ConsoleWriter.cs" />
<Compile Include="Tools\I18n.cs" />
<Compile Include="Tools\IConfigurable.cs" />
<Compile Include="Tools\SyncIO\Logger.cs" />
<Compile Include="Tools\PluginConfiuration.cs" />
<Compile Include="Tools\StringElement.cs" />
<Compile Include="Tools\Utils\ConfigurationHelper.cs" />
<Compile Include="Tools\Utils\PluginsHelper.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
<None Include="config.ini" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\App.config">
<SubType>Designer</SubType>
</None>
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\SyncIcon.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.5">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.5 %28x86 和 x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>xcopy $(ProjectDir)\..\Language $(ProjectDir)\$(OutDir)\Language\ /s/e/y</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
================================================
FILE: Sync/SyncHost.cs
================================================
using Sync.Command;
using Sync.Plugins;
using Sync.Tools;
using System;
using System.Collections.Generic;
using static Sync.Tools.IO;
using static Sync.Tools.DefaultI18n;
using Sync.Client;
using Sync.Source;
using System.Reflection;
using System.Diagnostics;
namespace Sync
{
/// <summary>
/// A manager for global modules
/// </summary>
public class SyncHost
{
public static SyncHost Instance { get; internal set; }
private SourceWorkWrapper sourceWrapper;
private ClientWorkWrapper clientWrapper;
private CommandManager commands;
private PluginManager plugins;
private SourceManager sources;
private FilterManager filters;
private MessageDispatcher messages;
private ClientManager clients;
/// <summary>
/// Internal use only
/// </summary>
internal SyncHost()
{
}
/// <summary>
/// Invoke to load plugins
/// </summary>
internal void Load()
{
CurrentIO.Write(LANG_Loading);
//Initial plugins manager
plugins = new PluginManager();
CurrentIO.WriteColor(String.Format(LANG_Plugins, plugins.LoadPlugins()), ConsoleColor.Green);
//Initial danmaku source
sources = new SourceManager();
CurrentIO.WriteColor(String.Format(LANG_Sources, plugins.LoadSources()), ConsoleColor.Green);
//select a danmaku source by config
try
{
sourceWrapper = new SourceWorkWrapper(sources);
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitSourceWarpperEvent(sourceWrapper));
}
catch
{
CurrentIO.Write("");
CurrentIO.WriteColor(LANG_Error, ConsoleColor.Red);
CurrentIO.WriteColor("Press enter to continue", ConsoleColor.Red);
CurrentIO.ReadCommand();
}
//Get clients singleton
clients = ClientManager.Instance;
CurrentIO.WriteColor(String.Format(LANG_Client, plugins.LoadClients()), ConsoleColor.Green);
clientWrapper = new ClientWorkWrapper(clients);
PluginEvents.Instance.RaiseEvent(new PluginEvents.InitClientWarpperEvent(clientWrapper));
commands = new CommandManager();
CurrentIO.WriteColor(String.Format(LANG_Commands, plugins.LoadCommnads()), ConsoleColor.Green);
filters = new FilterManager();
CurrentIO.WriteColor(String.Format(LANG_Filters, plugins.LoadFilters()), ConsoleColor.Green);
messages = new MessageDispatcher(filters);
plugins.ReadyProgram();
CurrentIO.WriteColor(LANG_Ready, ConsoleColor.Cyan);
}
/// <summary>
/// The internal PluginManager instance property
/// </summary>
internal PluginManager Plugins { get { return plugins; } }
/// <summary>
/// Read only plugins list
/// </summary>
/// <returns></returns>
public IEnumerable<Plugin> EnumPluings()
{
return plugins.GetPlugins();
}
public CommandManager Commands
{
get
{
return commands;
}
}
public SourceManager Sources
{
get
{
return sources;
}
}
public FilterManager Filters
{
get
{
return filters;
}
}
public MessageDispatcher Messages
{
get { return messages; }
}
public ClientManager Clients { get => clients; }
public SourceWorkWrapper SourceWrapper { get => sourceWrapper; }
public ClientWorkWrapper ClientWrapper { get => clientWrapper; }
public void ExitSync()
{
try
{
SaveSync();
}
finally
{
Environment.Exit(0);
}
}
public void SaveSync()
{
ClientWrapper?.Client?.StopWork();
SourceWrapper?.Source?.Disconnect();
foreach (var item in PluginConfigurationManager.ConfigurationSet)
{
item.SaveAll();
}
plugins.GetPluginList().ForEach(p => p.OnExit());
}
public void RestartSync()
{
try
{
SaveSync();
}
finally
{
ForceRestartSync();
}
}
public void ForceRestartSync()
{
Process.Start(Assembly.GetEntryAssembly().Location);
Environment.Exit(0);
}
}
}
================================================
FILE: Sync/Tools/Builtin/CommonCommand.cs
================================================
using Sync.Command;
using Sync.MessageFilter;
using Sync.Plugins;
using Sync.Source;
using Sync.Tools;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using static Sync.Tools.DefaultI18n;
namespace Sync.Tools.Builtin
{
public sealed class CommonCommand
{
public void BindCommondCommand(CommandDispatch dispatch)
{
dispatch.bind("exit", exit, LANG_COMMANDS_EXIT);
dispatch.bind("restart", restart, LANG_COMMANDS_RESTART);
dispatch.bind("stop", stop, LANG_COMMANDS_STOP);
dispatch.bind("start", start, LANG_COMMANDS_START);
dispatch.bind("status", status, LANG_COMMANDS_STATUS);
dispatch.bind("sourcemsg", sourcemsg, LANG_COMMANDS_SOURCEMSG);
dispatch.bind("clientmsg", clientmsg, LANG_COMMANDS_CLIENTMSG);
dispatch.bind("clientusermsg", chatuser, LANG_COMMANDS_CLIENTUSERMSG);
dispatch.bind("disable", disable, LANG_COMMANDS_DISABLE);
dispatch.bind("client", switchclient, LANG_COMMANDS_SWITCH_CLIENT);
dispatch.bind("sourcelogin", sourcelogin, LANG_COMMANDS_SOURCELOGIN);
dispatch.bind("clear", clear, LANG_COMMANDS_CLEAR);
dispatch.bind("help", help, LANG_COMMANDS_HELP);
dispatch.bind("listlang", languages, LANG_COMMANDS_LISTLANG);
dispatch.bind("lang", language, LANG_COMMANDS_LANG);
dispatch.bind("msgmgr", msgmgr, LANG_COMMANDS_MSGMGR);
dispatch.bind("source", listsource, LANG_COMMANDS_SOURCES);
dispatch.bind("filters", filters, LANG_COMMANDS_FILTERS);
}
private bool listsource(Arguments arg)
{
foreach (SourceBase src in SyncHost.Instance.Sources.SourceList)
{
IO.CurrentIO.WriteColor("", ConsoleColor.Gray, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_SOURCES_NAME, ConsoleColor.Cyan, false, false);
IO.CurrentIO.WriteColor(src.Name.PadRight(18), ConsoleColor.White, false, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_SOURCES_AUTHOR, ConsoleColor.DarkCyan, false, false);
IO.CurrentIO.WriteColor(src.Author, ConsoleColor.White, true, false);
}
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_CURRENT, SyncHost.Instance.ClientWrapper?.Client?.ClientName ?? "还没指定接收源"), ConsoleColor.Green);
return true;
}
private bool switchclient(Arguments arg)
{
if (arg.Count == 0)
{
foreach (var item in SyncHost.Instance.Clients.Clients)
{
IO.CurrentIO.WriteColor("", ConsoleColor.Gray, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_CLIENT_NAME, ConsoleColor.Cyan, false, false);
IO.CurrentIO.WriteColor(item.ClientName.PadRight(18), ConsoleColor.White, false, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_CLIENT_AUTHOR, ConsoleColor.DarkCyan, false, false);
IO.CurrentIO.WriteColor(item.Author, ConsoleColor.White, true, false);
}
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_CURRENT, SyncHost.Instance.SourceWrapper?.Source?.Name ?? "还没指定发送源"), ConsoleColor.Green);
}
else
{
if (SyncHost.Instance.Clients.Clients.FirstOrDefault(p => p.ClientName == arg[0]) == null) return false;
DefaultConfiguration.Instance.Client = arg[0];
SyncHost.Instance.ClientWrapper.ResetClient();
}
return true;
}
private bool disable(Arguments arg)
{
if (arg.Count == 0)
IO.CurrentIO.WriteColor(LANG_NO_PLUGIN_SELECT, ConsoleColor.Red);
else
foreach (var item in Sync.SyncHost.Instance.EnumPluings())
{
if (item.Name == arg[0])
{
item.OnDisable();
IO.CurrentIO.WriteColor(LANG_PLUGIN_DISABLED + arg[0], ConsoleColor.Red);
}
}
return true;
}
private bool sourcelogin(Arguments arg)
{
if (SyncHost.Instance.SourceWrapper.Sendable)
{
switch (arg.Count)
{
case 0:
SyncHost.Instance.SourceWrapper.SendableSource.Login("", "");
break;
case 1:
SyncHost.Instance.SourceWrapper.SendableSource.Login(arg[0], "");
break;
case 2:
SyncHost.Instance.SourceWrapper.SendableSource.Login(arg[0], arg[1]);
break;
default:
break;
}
}
else
IO.CurrentIO.WriteColor(string.Format(LANG_SOURCE_NOT_SUPPORT_SEND, SyncHost.Instance.SourceWrapper.Source?.GetType().Name), ConsoleColor.Red);
return true;
}
private bool clientmsg(Arguments arg)
{
if (arg.Count == 0 || (SyncHost.Instance.ClientWrapper.Client.CurrentStatus != SourceStatus.CONNECTED_WORKING))
{
IO.CurrentIO.Write(LANG_COMMANDS_CHAT_IRC_NOTCONNECT);
return true;
}
SyncHost.Instance.Messages.RaiseMessage<ISourceDanmaku>(new DanmakuMessage()
{
User = "Console",
Message = string.Join(" ", arg)
});
return true;
}
private bool chatuser(Arguments arg)
{
if (arg.Count < 1 || (SyncHost.Instance.ClientWrapper.Client.CurrentStatus != SourceStatus.CONNECTED_WORKING))
{
IO.CurrentIO.Write(LANG_COMMANDS_CHAT_IRC_NOTCONNECT);
}
var message = string.Join(" ",arg.Skip(1));
SyncHost.Instance.Messages.RaiseMessage<ISourceDanmaku>(new DanmakuMessage()
{
User = arg[0].Trim(),
Message = message
});
return true;
}
private bool sourcemsg(Arguments arg)
{
if (SyncHost.Instance.SourceWrapper.Sendable)
{
if (SyncHost.Instance.SourceWrapper.SendableSource.SendStatus)
{
SyncHost.Instance.SourceWrapper.SendableSource.Send(new IRCMessage(string.Empty, string.Join("", arg)));
return true;
}
else
{
IO.CurrentIO.Write(LANG_COMMANDS_DANMAKU_REQUIRE_LOGIN);
}
}
else
{
IO.CurrentIO.Write(LANG_COMMANDS_DANMAKU_NOT_SUPPORT);
}
return false;
}
private bool start(Arguments arg)
{
if (SyncHost.Instance.SourceWrapper.Source == null)
{
IO.CurrentIO.WriteColor(LANG_COMMANDS_START_NO_SOURCE, ConsoleColor.Red);
return true;
}
if (SyncHost.Instance.ClientWrapper.Client == null)
{
IO.CurrentIO.WriteColor(LANG_COMMANDS_START_NO_CLIENT, ConsoleColor.Red);
return true;
}
if (SyncHost.Instance.SourceWrapper.Source.Status == SourceStatus.CONNECTED_WORKING)
{
IO.CurrentIO.WriteColor(LANG_COMMANDS_START_ALREADY_RUN, ConsoleColor.Red);
return true;
}
SyncHost.Instance.ClientWrapper?.Client?.StartWork();
SyncHost.Instance.SourceWrapper?.Source?.Connect();
return true;
}
private bool stop(Arguments arg)
{
SyncHost.Instance.ClientWrapper.Client?.StopWork();
SyncHost.Instance.SourceWrapper.Source?.Disconnect();
return true;
}
private bool status(Arguments arg)
{
IO.CurrentIO.WriteStatus();
return true;
}
private bool language(Arguments arg)
{
if (arg.Count == 0)
{
CultureInfo info = CultureInfo.GetCultureInfo(I18n.Instance.CurrentLanguage);
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_CURRENT_LANG, info.Name, info.NativeName), ConsoleColor.Yellow);
return true;
}
else if (arg.Count == 1)
{
try
{
CultureInfo info = CultureInfo.GetCultureInfo(arg[0]);
DefaultConfiguration.Instance.Language = arg[0];
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_LANG_SWITCHED, arg[0], info.NativeName), ConsoleColor.Green);
return true;
}
catch (CultureNotFoundException)
{
IO.CurrentIO.WriteColor(LANG_COMMANDS_LANG_NOT_FOUND, ConsoleColor.Red);
return false;
}
}
return false;
}
private bool clear(Arguments arg)
{
IO.CurrentIO.Clear();
IO.CurrentIO.WriteWelcome();
return true;
}
private bool help(Arguments arg)
{
IO.CurrentIO.WriteHelp();
return true;
}
private static Dictionary<string, Action<Arguments>> MessageManagerCommandMap = new Dictionary<string, Action<Arguments>>
{
{"--help",msgmgr_help},
{"--status",msgmgr_status},
{"--limit",msgmgr_limit},
{"--option",msgmgr_option}
};
private static void msgmgr_help(Arguments arg)
{
IO.CurrentIO.WriteColor(LANG_COMMANDS_MSGMGR_HELP, ConsoleColor.Yellow);
}
private static void msgmgr_status(Arguments arg)
{
IO.CurrentIO.WriteColor(String.Format(LANG_COMMANDS_MSGMGR_STATUS, (string)(MessageManager.IsLimit ? LANG_COMMANDS_MSGMGR_LIMIT : LANG_COMMANDS_MSGMGR_FREE), MessageManager.CurrentQueueCount, MessageManager.LimitLevel, MessageManager.RecoverTime, MessageManager.Option.ToString()), ConsoleColor.Yellow);
}
private static void msgmgr_limit(Arguments arg)
{
if (arg.Count == 2 && Int32.TryParse(arg[1].Trim(), out int value))
{
MessageManager.LimitLevel = value;
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_MSGMGR_LIMIT_SPEED_SET, MessageManager.LimitLevel), ConsoleColor.Yellow);
}
else
IO.CurrentIO.WriteColor(LANG_COMMANDS_ARGUMENT_WRONG, ConsoleColor.Red);
}
private static void msgmgr_option(Arguments arg)
{
if (arg.Count == 2)
{
MessageManager.SetOption(arg[1].Trim());
IO.CurrentIO.WriteColor(string.Format(LANG_COMMANDS_MSGMGR_LIMIT_STYPE_SET, MessageManager.Option.ToString()), ConsoleColor.Yellow);
}
else
IO.CurrentIO.WriteColor(LANG_COMMANDS_ARGUMENT_WRONG, ConsoleColor.Red);
}
private bool msgmgr(Arguments arg)
{
if (arg.Count == 0)
IO.CurrentIO.WriteColor(LANG_COMMANDS_ARGUMENT_WRONG, ConsoleColor.Red);
else
MessageManagerCommandMap[arg[0]](arg);
return true;
}
private bool languages(Arguments arg)
{
if (arg.Count > 0 && arg[0] == "--all")
{
foreach (var item in CultureInfo.GetCultures(CultureTypes.NeutralCultures))
{
IO.CurrentIO.WriteColor(string.Format("CultureName: {0:S}\t{1:S}", item.Name, item.NativeName), ConsoleColor.Yellow);
}
}
else
{
foreach (var item in System.IO.Directory.EnumerateDirectories(I18n.Instance.LangFolder))
{
string name = item.Substring(item.LastIndexOf('\\') + 1);
IO.CurrentIO.WriteColor(string.Format("CultureName: {0:S}\t{1:S}", name, CultureInfo.GetCultureInfo(name).NativeName), ConsoleColor.Yellow);
}
}
return true;
}
private bool exit(Arguments arg)
{
stop(arg);
SyncHost.Instance.ExitSync();
IO.CurrentIO.Write(LANG_COMMANDS_EXIT_DONE);
return true;
}
private bool restart(Arguments arg)
{
Process.Start(Assembly.GetEntryAssembly().Location, "-f");
Environment.Exit(0);
return true;
}
private bool filters(Arguments arg)
{
foreach (var item in SyncHost.Instance.Filters.GetFiltersEnum())
{
IO.CurrentIO.WriteColor("", ConsoleColor.Gray, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_FILTERS_ITEM, ConsoleColor.Cyan, false, false);
IO.CurrentIO.WriteColor(item.Key.Name.PadRight(22), ConsoleColor.White, false, false);
IO.CurrentIO.WriteColor(LANG_COMMANDS_FILTERS_OBJ, ConsoleColor.DarkCyan, false, false);
IO.CurrentIO.WriteColor(item.Value.GetType().Name, ConsoleColor.White, true, false);
}
return true;
}
}
}
================================================
FILE: Sync/Tools/Builtin/InternalPlugin.cs
================================================
using Sync.Command;
using Sync.Plugins;
using System;
namespace Sync.Tools.Builtin
{
public class InternalPlugin : Plugin
{
//private PluginConfigurationManager config;
private CommonCommand commonCommand = new CommonCommand();
public InternalPlugin() : base("InternalPlugin", "OsuSync")
{
}
public override void OnEnable()
{
EventBus.BindEvent<PluginEvents.InitCommandEvent>(p =>
{
Func<string, CommandDelegate, string, bool> addCmd = p.Commands.Dispatch.bind;
addCmd("plugins", PluginCommand.Instance.Plugins, "Install & Update Plugins online, type 'plugins' to get help.");
commonCommand.BindCommondCommand(p.Commands.Dispatch);
});
}
internal bool CheckUpdate(string guid) => PluginCommand.Instance.InternalUpdate(guid,true);
}
}
================================================
FILE: Sync/Tools/Builtin/PluginCommand.cs
================================================
using Sync.Command;
using Sync.Plugins;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Security.Cryptography;
using System.Text;
using static Sync.Tools.DefaultI18n;
namespace Sync.Tools.Builtin
{
internal sealed class PluginCommand
{
#region SingleInstance
private static PluginCommand instance = null;
internal static PluginCommand Instance => instance ?? (instance = new PluginCommand());
#endregion
#region Updater Decleare
[DataContract]
public class UpdateData
{
[DataMember(Order = 0)]
public int id { get; set; }
[DataMember(Order = 1)]
public string name { get; set; }
[DataMember(Order = 2)]
public
gitextract_0_roh6il/ ├── .gitignore ├── .gitmodules ├── LICENSE ├── Language/ │ ├── de-DE/ │ │ ├── BanManagerPlugin.DefaultLanguage.lang │ │ ├── BeatmapSuggest.DefaultLanguage.lang │ │ ├── ConfigGUI.DefaultLanguage.lang │ │ ├── DefaultGUI.Language.lang │ │ ├── DefaultPlugin.Language.lang │ │ ├── NowPlaying.Languages.lang │ │ ├── OsuRTDataProvider.DefaultLanguage.lang │ │ ├── RealTimePPDisplayer.DefaultLanguage.lang │ │ ├── RecentlyUserQuery.DefaultLanguage.lang │ │ └── Sync.Tools.DefaultI18n.lang │ ├── en-US/ │ │ ├── BanManagerPlugin.DefaultLanguage.lang │ │ ├── BeatmapSuggest.DefaultLanguage.lang │ │ ├── ConfigGUI.DefaultLanguage.lang │ │ ├── DefaultGUI.Language.lang │ │ ├── DefaultPlugin.Language.lang │ │ ├── NowPlaying.Languages.lang │ │ ├── OsuRTDataProvider.DefaultLanguage.lang │ │ ├── RealTimePPDisplayer.DefaultLanguage.lang │ │ ├── RecentlyUserQuery.DefaultLanguage.lang │ │ └── Sync.Tools.DefaultI18n.lang │ ├── hu-HU/ │ │ ├── BanManagerPlugin.DefaultLanguage.lang │ │ ├── DefaultGUI.Language.lang │ │ ├── DefaultPlugin.Language.lang │ │ ├── NowPlaying.Languages.lang │ │ ├── OsuRTDataProvider.DefaultLanguage.lang │ │ ├── RealTimePPDisplayer.DefaultLanguage.lang │ │ ├── RecentlyUserQuery.DefaultLanguage.lang │ │ └── Sync.Tools.DefaultI18n.lang │ ├── ja-JP/ │ │ ├── BanManagerPlugin.DefaultLanguage.lang │ │ ├── BeatmapSuggest.DefaultLanguage.lang │ │ ├── ConfigGUI.DefaultLanguage.lang │ │ ├── DefaultGUI.Language.lang │ │ ├── DefaultPlugin.Language.lang │ │ ├── NowPlaying.Languages.lang │ │ ├── OsuRTDataProvider.DefaultLanguage.lang │ │ ├── RealTimePPDisplayer.DefaultLanguage.lang │ │ ├── RecentlyUserQuery.DefaultLanguage.lang │ │ └── Sync.Tools.DefaultI18n.lang │ ├── ru-RU/ │ │ ├── BanManagerPlugin.DefaultLanguage.lang │ │ ├── BeatmapSuggest.DefaultLanguage.lang │ │ ├── ConfigGUI.DefaultLanguage.lang │ │ ├── DefaultGUI.Language.lang │ │ ├── DefaultPlugin.Language.lang │ │ ├── NowPlaying.Languages.lang │ │ ├── OsuRTDataProvider.DefaultLanguage.lang │ │ ├── RealTimePPDisplayer.DefaultLanguage.lang │ │ ├── RecentlyUserQuery.DefaultLanguage.lang │ │ └── Sync.Tools.DefaultI18n.lang │ └── zh-CN/ │ ├── BanManagerPlugin.DefaultLanguage.lang │ ├── ConfigGUI.DefaultLanguage.lang │ ├── DefaultGUI.Language.lang │ ├── DefaultPlugin.Language.lang │ ├── NowPlaying.Languages.lang │ ├── RecentlyUserQuery.DefaultLanguage.lang │ └── Sync.Tools.DefaultI18n.lang ├── README.md ├── Sync/ │ ├── Client/ │ │ ├── ClientEvent.cs │ │ ├── ClientManager.cs │ │ ├── ClientWorkWrapper.cs │ │ └── DefaultReciveClient.cs │ ├── Command/ │ │ ├── CommandDispatch.cs │ │ └── CommandManager.cs │ ├── Dependence/ │ │ └── config.ini │ ├── Event/ │ │ └── EventDispatcher.cs │ ├── MessageFilter/ │ │ ├── FilterBase.cs │ │ ├── FilterManager.cs │ │ ├── FilterPriorityAttribute.cs │ │ ├── MessageDispatcher.cs │ │ └── MessageManager.cs │ ├── Plugins/ │ │ ├── Plugin.cs │ │ └── PluginManager.cs │ ├── Program.cs │ ├── Properties/ │ │ ├── AssemblyInfo.cs │ │ ├── Resources.Designer.cs │ │ ├── Resources.resx │ │ ├── Settings.Designer.cs │ │ └── Settings.settings │ ├── Resources/ │ │ ├── App.config │ │ └── icon.psd │ ├── Source/ │ │ ├── SourceBase.cs │ │ ├── SourceEvent.cs │ │ ├── SourceManager.cs │ │ └── SourceWorkWrapper.cs │ ├── Sync.csproj │ ├── SyncHost.cs │ ├── Tools/ │ │ ├── Builtin/ │ │ │ ├── CommonCommand.cs │ │ │ ├── InternalPlugin.cs │ │ │ └── PluginCommand.cs │ │ ├── CommandParser.cs │ │ ├── Configuration.cs │ │ ├── ConfigurationAttribute/ │ │ │ ├── BaseConfigurationAttribute.cs │ │ │ ├── BoolAttribute.cs │ │ │ ├── ClientAndSourceAttribute.cs │ │ │ ├── ColorAttribute.cs │ │ │ ├── ConfigurationHolderAttribute.cs │ │ │ ├── FloatAttribute.cs │ │ │ ├── FontAttribute.cs │ │ │ ├── GuiLanguageElement.cs │ │ │ ├── IntegerAttribute.cs │ │ │ ├── ListAttribute.cs │ │ │ ├── PathAttribute.cs │ │ │ └── StringAttribute.cs │ │ ├── ConfigurationIO.cs │ │ ├── I18n.cs │ │ ├── IConfigurable.cs │ │ ├── PluginConfiuration.cs │ │ ├── SentryHelper.cs │ │ ├── StartupArgument.cs │ │ ├── StartupHelper.cs │ │ ├── StringElement.cs │ │ ├── SyncIO/ │ │ │ ├── ConsoleWriter.cs │ │ │ ├── FileLoggerWriter.cs │ │ │ ├── IOWrapper.cs │ │ │ ├── Logger.cs │ │ │ └── NConsoleWriter.cs │ │ ├── Updater.cs │ │ └── Utils/ │ │ ├── ConfigurationHelper.cs │ │ └── PluginsHelper.cs │ ├── app.config │ ├── config.ini │ └── packages.config └── Sync.sln
SYMBOL INDEX (447 symbols across 55 files)
FILE: Sync/Client/ClientEvent.cs
class ClientEvents (line 14) | public class ClientEvents : BaseEventDispatcher<IClientEvent>
method ClientEvents (line 17) | private ClientEvents()
type IClientEvent (line 26) | public interface IClientEvent : IBaseEvent { }
type ClientStartWorkEvent (line 31) | public struct ClientStartWorkEvent : IClientEvent
type ClientStopWorkEvent (line 39) | public struct ClientStopWorkEvent : IClientEvent
type ClientOnMessageEvent (line 47) | public struct ClientOnMessageEvent : IClientEvent
method ClientOnMessageEvent (line 51) | public ClientOnMessageEvent(IRCMessage message)
FILE: Sync/Client/ClientManager.cs
class ClientManager (line 13) | public class ClientManager
method ClientManager (line 20) | private ClientManager()
method AddAllClient (line 25) | public void AddAllClient(params DefaultClient[] clients)
method AddClient (line 36) | public bool AddClient(DefaultClient client)
FILE: Sync/Client/ClientWorkWrapper.cs
class ClientWorkWrapper (line 13) | public class ClientWorkWrapper
method ClientWorkWrapper (line 19) | public ClientWorkWrapper(ClientManager manager)
method ResetClient (line 28) | public void ResetClient()
FILE: Sync/Client/DefaultReciveClient.cs
class DefaultClient (line 12) | public abstract class DefaultClient
method SwitchOtherClient (line 26) | public abstract void SwitchOtherClient();
method SwitchThisClient (line 30) | public abstract void SwitchThisClient();
method DefaultClient (line 32) | public DefaultClient(string Author, string Name)
method EnqueueMessage (line 43) | protected void EnqueueMessage(IRCMessage msg)
method StartWork (line 48) | public abstract void StartWork();
method StopWork (line 49) | public abstract void StopWork();
method Restart (line 50) | public abstract void Restart();
method SendMessage (line 59) | public abstract void SendMessage(IMessageBase message);
FILE: Sync/Command/CommandDispatch.cs
class Arguments (line 16) | public class Arguments : List<string>
method Arguments (line 18) | public Arguments()
method Arguments (line 23) | public Arguments(params string[] args)
class CommandDispatch (line 37) | public class CommandDispatch
method bind (line 53) | public bool bind(string name, CommandDelegate func, string desc)
method get (line 61) | public CommandDelegate get(string name)
method getCommandsHelp (line 67) | public IDictionary<string, string> getCommandsHelp()
method invoke (line 72) | public bool invoke(string name, Arguments args)
FILE: Sync/Command/CommandManager.cs
class CommandManager (line 10) | public class CommandManager
method CommandManager (line 14) | public CommandManager()
method invokeCmdString (line 31) | public void invokeCmdString(string cmd)
FILE: Sync/Event/EventDispatcher.cs
type IBaseEvent (line 13) | public interface IBaseEvent
class EventDispatcherTaskScheduler (line 17) | public class EventDispatcherTaskScheduler : TaskScheduler
method GetScheduledTasks (line 20) | protected override IEnumerable<Task> GetScheduledTasks()
method QueueTask (line 25) | protected override void QueueTask(Task task)
method TryExecuteTaskInline (line 31) | protected override bool TryExecuteTaskInline(Task task, bool taskWasPr...
class BaseEventDispatcher (line 37) | public abstract class BaseEventDispatcher<T> where T : IBaseEvent
method raiseEventAsync (line 44) | private void raiseEventAsync<Event>(Event insance) where Event : T
method raiseEvent (line 49) | private void raiseEvent<Event>(Event insance) where Event : T
method RaiseEventAsync (line 59) | public virtual void RaiseEventAsync<Event>(Event @event) where Event : T
method RaiseEvent (line 69) | public virtual void RaiseEvent<Event>(Event @event) where Event : T
method BindEvent (line 79) | public void BindEvent<Event>(EventHandlerFunc<Event> handler) where Ev...
class HandlerList (line 93) | public class HandlerList : LinkedList<object>
class Dispatcher (line 101) | public class Dispatcher : Dictionary<Type, HandlerList>
class EventDispatcher (line 109) | public class EventDispatcher
method EventDispatcher (line 114) | private EventDispatcher()
method RegisterNewDispatcher (line 126) | public void RegisterNewDispatcher<EventDispatcher, TEvent>() where Eve...
method RegisterNewDispatcher (line 135) | public void RegisterNewDispatcher(Type t)
method GetHandlerList (line 148) | public HandlerList GetHandlerList<Event>(Type eventType)
method GetHandlerList (line 159) | public HandlerList GetHandlerList(Type eventType, Type @event)
method GetDispatcher (line 169) | public Dispatcher GetDispatcher(Type eventType)
method GetDispatcher (line 179) | public Dispatcher GetDispatcher<EventType>()
method ExistDispatcher (line 189) | public bool ExistDispatcher<EventType>()
method ExistDispatcher (line 199) | public bool ExistDispatcher(Type eventType)
method RaiseEventAsync (line 210) | internal void RaiseEventAsync<EventType, Event>(Event @event) where E...
method RaiseEventAsync (line 221) | internal void RaiseEventAsync<Event>(Type eventType, Event @event) whe...
method RaiseEvent (line 238) | internal void RaiseEvent<EventType, Event>(Event @event) where Event :...
method RaiseEvent (line 249) | internal void RaiseEvent<Event>(Type eventType, Event @event) where Ev...
method RegisterEventHandler (line 266) | public bool RegisterEventHandler<Event>(Type eventType, EventHandlerFu...
method RegisterEventHandler (line 295) | public bool RegisterEventHandler<EventType, Event>(EventHandlerFunc<Ev...
method RemoveEventHandler (line 306) | public void RemoveEventHandler<EventType, Event>(EventHandlerFunc<Even...
FILE: Sync/MessageFilter/FilterBase.cs
type IMessageBase (line 12) | public interface IMessageBase : IBaseEvent
type OnlineChangeMessage (line 22) | public struct OnlineChangeMessage : IMessageBase
method OnlineChangeMessage (line 30) | public OnlineChangeMessage(int count)
type GiftMessage (line 43) | public struct GiftMessage : IMessageBase
method GiftMessage (line 55) | public GiftMessage(IBaseGiftEvent src)
type DanmakuMessage (line 69) | public struct DanmakuMessage : IMessageBase
method DanmakuMessage (line 78) | public DanmakuMessage(IBaseDanmakuEvent src)
type IRCMessage (line 89) | public struct IRCMessage : IMessageBase
method IRCMessage (line 98) | public IRCMessage(StringElement user, StringElement rawMessage)
type ISourceOnlineChange (line 106) | public interface ISourceOnlineChange
type ISourceGift (line 111) | public interface ISourceGift
type ISourceDanmaku (line 116) | public interface ISourceDanmaku
type ISourceClient (line 121) | public interface ISourceClient
type IFilter (line 126) | public interface IFilter
method onMsg (line 128) | void onMsg(ref IMessageBase msg);
FILE: Sync/MessageFilter/FilterManager.cs
class FilterManager (line 13) | public class FilterManager : BaseEventDispatcher<IMessageBase>
method FilterManager (line 17) | internal FilterManager()
method AddSource (line 45) | private void AddSource<T>()
method GetFiltersEnum (line 50) | public IEnumerable<KeyValuePair<Type, IFilter>> GetFiltersEnum()
method PassFilterDanmaku (line 63) | internal void PassFilterDanmaku(ref IMessageBase msg)
method PassFilterOSU (line 68) | internal void PassFilterOSU(ref IMessageBase msg)
method PassFilterGift (line 73) | internal void PassFilterGift(ref IMessageBase msg)
method PassFilterOnlineChange (line 78) | internal void PassFilterOnlineChange(ref IMessageBase msg)
method PassFilter (line 83) | private void PassFilter<T>(ref IMessageBase msg)
method PassFilter (line 88) | private void PassFilter(Type identify, ref IMessageBase msg)
method AddFilter (line 101) | public void AddFilter(IFilter filter)
method deleteFilter (line 113) | public void deleteFilter(IFilter filter)
method AddFilters (line 124) | public void AddFilters(params IFilter[] filters)
FILE: Sync/MessageFilter/FilterPriorityAttribute.cs
type FilterPriority (line 9) | public enum FilterPriority
class FilterPriorityAttribute (line 18) | [AttributeUsage(AttributeTargets.Class)]
class FilterPriorityAttributeExtension (line 24) | public static class FilterPriorityAttributeExtension
method GetFilterPriority (line 26) | public static FilterPriority GetFilterPriority(this IFilter filter)
FILE: Sync/MessageFilter/MessageDispatcher.cs
class MessageDispatcher (line 13) | public class MessageDispatcher
method MessageDispatcher (line 17) | internal MessageDispatcher(FilterManager f)
method onDanmaku (line 32) | public void onDanmaku(IBaseDanmakuEvent danmaku)
method onIRC (line 43) | public void onIRC(StringElement user, StringElement message)
method RaiseMessage (line 51) | public void RaiseMessage<Source>(IMessageBase msg)
method RaiseMessage (line 59) | private void RaiseMessage(Type msgType, IMessageBase msg)
FILE: Sync/MessageFilter/MessageManager.cs
class MessageManager (line 14) | public class MessageManager
type MessageBaseWrapper (line 79) | private struct MessageBaseWrapper
class SendFilter (line 86) | private class SendFilter : IFilter, ISourceDanmaku
method onMsg (line 88) | public void onMsg(ref IMessageBase msg)
type PeekOption (line 124) | public enum PeekOption
method Init (line 132) | public static void Init(FilterManager manager)
method PostIRCMessage (line 139) | public static void PostIRCMessage(string target, IMessageBase message)
method SetOption (line 153) | public static void SetOption(string optionName)
method SetSendMessageAction (line 163) | public static void SetSendMessageAction(SendMessageAction action)
method SendMessage (line 168) | public static void SendMessage(string userName, string message)
method runThread (line 173) | private static void runThread(object state)
FILE: Sync/Plugins/Plugin.cs
class Plugin (line 7) | public abstract class Plugin
method Plugin (line 13) | public Plugin(string Name, string Author)
method getHoster (line 19) | protected SyncHost getHoster()
method getName (line 24) | public string getName()
method getAuthor (line 29) | public string getAuthor()
method getGuid (line 34) | public string getGuid()
method ToString (line 39) | public override string ToString()
method OnDisable (line 44) | public virtual void OnDisable()
method OnEnable (line 49) | public virtual void OnEnable()
method OnExit (line 54) | public virtual void OnExit()
FILE: Sync/Plugins/PluginManager.cs
type IPluginEvent (line 17) | public interface IPluginEvent : IBaseEvent { }
class PluginEvents (line 22) | public class PluginEvents : BaseEventDispatcher<IPluginEvent>
type InitPluginEvent (line 27) | public struct InitPluginEvent : IPluginEvent
method InitPluginEvent (line 31) | public InitPluginEvent(Plugin plugin)
type InitSourceEvent (line 40) | public struct InitSourceEvent : IPluginEvent
method InitSourceEvent (line 44) | public InitSourceEvent(SourceManager source)
type InitFilterEvent (line 53) | public struct InitFilterEvent : IPluginEvent
method InitFilterEvent (line 57) | public InitFilterEvent(FilterManager filters)
type InitCommandEvent (line 66) | public struct InitCommandEvent : IPluginEvent
method InitCommandEvent (line 70) | public InitCommandEvent(CommandManager commands)
type InitClientEvent (line 79) | public struct InitClientEvent : IPluginEvent
method InitClientEvent (line 83) | public InitClientEvent(ClientManager clients)
type InitSourceWarpperEvent (line 92) | public struct InitSourceWarpperEvent : IPluginEvent
method InitSourceWarpperEvent (line 96) | public InitSourceWarpperEvent(SourceWorkWrapper wrapper)
type InitClientWarpperEvent (line 105) | public struct InitClientWarpperEvent : IPluginEvent
method InitClientWarpperEvent (line 109) | public InitClientWarpperEvent(ClientWorkWrapper wrapper)
type LoadCompleteEvent (line 118) | public struct LoadCompleteEvent : IPluginEvent
method LoadCompleteEvent (line 122) | public LoadCompleteEvent(SyncHost host)
type ConfigurationChange (line 128) | public struct ConfigurationChange : IPluginEvent
type ProgramReadyEvent (line 135) | public struct ProgramReadyEvent : IPluginEvent
method PluginEvents (line 146) | private PluginEvents()
class PluginManager (line 156) | public class PluginManager
method PluginManager (line 163) | internal PluginManager()
method LoadCommnads (line 171) | internal int LoadCommnads()
method LoadSources (line 181) | internal int LoadSources()
method LoadFilters (line 191) | internal int LoadFilters()
method LoadClients (line 201) | internal int LoadClients()
method ReadySync (line 210) | internal void ReadySync()
method GetPlugins (line 219) | public IEnumerable<Plugin> GetPlugins()
method GetPluginList (line 228) | internal List<Plugin> GetPluginList()
method ReadyProgram (line 236) | internal void ReadyProgram()
method LoadPlugins (line 245) | internal int LoadPlugins()
method layerLoader (line 395) | private List<Type> layerLoader(IList<Type> asmList)
method LateLoad (line 451) | private bool LateLoad(Type a)
method CheckIsReferenceTo (line 505) | private bool CheckIsReferenceTo(Type a, string b)
method CheckIsReferenceTo (line 512) | private bool CheckIsReferenceTo(Type a, Type b)
method CheckIsHardReferenceTo (line 517) | private bool CheckIsHardReferenceTo(Type a, Type b)
method CheckIsSoftReferenceTo (line 524) | private bool CheckIsSoftReferenceTo(Type a, string b)
method CompareVersion (line 537) | public static bool CompareVersion(string a, string b)
method CheckUnknownDependency (line 563) | private void CheckUnknownDependency(string name)
method CheckGUIDUpdate (line 576) | private void CheckGUIDUpdate(SyncPluginDependency item)
method LoadPluginFormType (line 589) | private Plugin LoadPluginFormType(Type it)
class SyncMissingPluginException (line 607) | public class SyncMissingPluginException : Exception
method SyncMissingPluginException (line 609) | public SyncMissingPluginException(string msg) : base(msg)
class SyncPluginOutdateException (line 614) | public class SyncPluginOutdateException : Exception
method SyncPluginOutdateException (line 616) | public SyncPluginOutdateException(string msg) : base(msg)
class SyncRequirePlugin (line 624) | public class SyncRequirePlugin : Attribute
method SyncRequirePlugin (line 628) | public SyncRequirePlugin(params Type[] types)
class SyncSoftRequirePlugin (line 637) | public class SyncSoftRequirePlugin : Attribute
method SyncSoftRequirePlugin (line 641) | public SyncSoftRequirePlugin(params string[] types)
class SyncPluginID (line 647) | public class SyncPluginID : Attribute
method SyncPluginID (line 657) | public SyncPluginID(string GUID, string Version)
class SyncPluginDependency (line 664) | public class SyncPluginDependency : Attribute
method SyncPluginDependency (line 670) | public SyncPluginDependency(string guid) => GUID = guid;
FILE: Sync/Program.cs
class Program (line 8) | public static class Program
method Main (line 10) | static void Main(string[] args)
method CurrentDomain_UnhandledException (line 16) | private static void CurrentDomain_UnhandledException(object sender, Un...
FILE: Sync/Properties/Resources.Designer.cs
class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: Sync/Properties/Settings.Designer.cs
class Settings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
FILE: Sync/Source/SourceBase.cs
class SendableSource (line 15) | public abstract class SendableSource : SourceBase
method SendableSource (line 20) | public SendableSource(string Name, string Author) : base(Name, Author)
method login (line 25) | internal void login(string user, string password)
method Login (line 30) | public abstract void Login(string user, string password);
method Send (line 31) | public abstract void Send(IMessageBase message);
class SourceBase (line 37) | public abstract class SourceBase
method SourceBase (line 47) | public SourceBase(string Name, string Author)
method RaiseEvent (line 59) | protected void RaiseEvent<T>(T args) where T : ISourceEvent
method connect (line 64) | internal void connect()
method disconnect (line 70) | internal void disconnect()
method Connect (line 76) | public abstract void Connect();
method Disconnect (line 77) | public abstract void Disconnect();
type SourceStatus (line 110) | public enum SourceStatus
FILE: Sync/Source/SourceEvent.cs
class SourceEvents (line 16) | public sealed class SourceEvents : BaseEventDispatcher<ISourceEvent>
method SourceEvents (line 20) | private SourceEvents()
type StartSourceEvent (line 29) | public struct StartSourceEvent : ISourceEvent
type StopSyncEvent (line 37) | public struct StopSyncEvent : ISourceEvent
type BaseDanmakuEvent (line 45) | public struct BaseDanmakuEvent : IBaseDanmakuEvent
method BaseDanmakuEvent (line 51) | public BaseDanmakuEvent(string danmaku, string sender, string time)
type IBaseDanmakuEvent (line 62) | public interface IBaseDanmakuEvent : ISourceEvent
type IBaseGiftEvent (line 72) | public interface IBaseGiftEvent : ISourceEvent
type BaseStatusEvent (line 84) | public struct BaseStatusEvent : ISourceEvent
method BaseStatusEvent (line 88) | public BaseStatusEvent(SourceStatus status)
type BaseOnlineCountEvent (line 97) | public struct BaseOnlineCountEvent : ISourceEvent
method BaseOnlineCountEvent (line 101) | public BaseOnlineCountEvent(int Count)
type ISourceEvent (line 110) | public interface ISourceEvent : IBaseEvent
FILE: Sync/Source/SourceManager.cs
class SourceManager (line 13) | public class SourceManager
method SourceManager (line 18) | public SourceManager()
method AddSource (line 31) | public bool AddSource(SourceBase src)
FILE: Sync/Source/SourceWorkWrapper.cs
class SourceWorkWrapper (line 15) | public class SourceWorkWrapper
method SourceWorkWrapper (line 20) | public SourceWorkWrapper(SourceManager sources)
FILE: Sync/SyncHost.cs
class SyncHost (line 18) | public class SyncHost
method SyncHost (line 33) | internal SyncHost()
method Load (line 41) | internal void Load()
method EnumPluings (line 96) | public IEnumerable<Plugin> EnumPluings()
method ExitSync (line 136) | public void ExitSync()
method SaveSync (line 148) | public void SaveSync()
method RestartSync (line 162) | public void RestartSync()
method ForceRestartSync (line 174) | public void ForceRestartSync()
FILE: Sync/Tools/Builtin/CommonCommand.cs
class CommonCommand (line 16) | public sealed class CommonCommand
method BindCommondCommand (line 18) | public void BindCommondCommand(CommandDispatch dispatch)
method listsource (line 44) | private bool listsource(Arguments arg)
method switchclient (line 60) | private bool switchclient(Arguments arg)
method disable (line 84) | private bool disable(Arguments arg)
method sourcelogin (line 100) | private bool sourcelogin(Arguments arg)
method clientmsg (line 128) | private bool clientmsg(Arguments arg)
method chatuser (line 144) | private bool chatuser(Arguments arg)
method sourcemsg (line 161) | private bool sourcemsg(Arguments arg)
method start (line 182) | private bool start(Arguments arg)
method stop (line 207) | private bool stop(Arguments arg)
method status (line 215) | private bool status(Arguments arg)
method language (line 221) | private bool language(Arguments arg)
method clear (line 247) | private bool clear(Arguments arg)
method help (line 254) | private bool help(Arguments arg)
method msgmgr_help (line 268) | private static void msgmgr_help(Arguments arg)
method msgmgr_status (line 273) | private static void msgmgr_status(Arguments arg)
method msgmgr_limit (line 278) | private static void msgmgr_limit(Arguments arg)
method msgmgr_option (line 289) | private static void msgmgr_option(Arguments arg)
method msgmgr (line 301) | private bool msgmgr(Arguments arg)
method languages (line 311) | private bool languages(Arguments arg)
method exit (line 331) | private bool exit(Arguments arg)
method restart (line 339) | private bool restart(Arguments arg)
method filters (line 346) | private bool filters(Arguments arg)
FILE: Sync/Tools/Builtin/InternalPlugin.cs
class InternalPlugin (line 7) | public class InternalPlugin : Plugin
method InternalPlugin (line 13) | public InternalPlugin() : base("InternalPlugin", "OsuSync")
method OnEnable (line 18) | public override void OnEnable()
method CheckUpdate (line 28) | internal bool CheckUpdate(string guid) => PluginCommand.Instance.Inter...
FILE: Sync/Tools/Builtin/PluginCommand.cs
class PluginCommand (line 19) | internal sealed class PluginCommand
class UpdateData (line 28) | [DataContract]
class SyncUpdate (line 56) | [DataContract]
method Plugins (line 71) | public bool Plugins(Arguments arg)
method AskAgreeUpdate (line 105) | private bool AskAgreeUpdate(UpdateData data)
method ShouldDownloadUpdate (line 112) | public bool ShouldDownloadUpdate(UpdateData update_data, string curren...
method InternalUpdate (line 122) | internal bool InternalUpdate(string plugin_guid, bool no_ask)
method InternalUpdate (line 154) | internal void InternalUpdate(IEnumerable<Plugin> update_plugins, bool ...
method Update (line 165) | private bool Update(bool no_ask = false)
method Update (line 174) | private bool Update(string part_plugin_name, bool no_ask = false)
method Search (line 188) | private bool Search(string keyword)
method InstallByKeyword (line 215) | internal bool InstallByKeyword(string keyword, bool requireRestart = t...
method Install (line 229) | private bool Install(string guid)
method Remove (line 242) | private bool Remove(string name)
method List (line 261) | private bool List()
method SyncUpdateCheck (line 286) | internal bool SyncUpdateCheck(bool download = false)
method Help (line 316) | private bool Help()
method RequireRestart (line 328) | private void RequireRestart(string msg)
method Serializer (line 335) | private T Serializer<T>(string url)
method MD5HashFile (line 345) | private string MD5HashFile(string filePath)
method DownloadSingleFile (line 361) | private bool DownloadSingleFile(string dlUrl, string path, string name)
FILE: Sync/Tools/CommandParser.cs
class CommandParser (line 9) | internal class CommandParser<T>
method CommandParser (line 18) | internal CommandParser(string[] args) : this(args, new Dictionary<stri...
method CommandParser (line 21) | internal CommandParser(string[] args, Dictionary<string, Func<string, ...
method ParseCommands (line 29) | public void ParseCommands()
method ParseStringBlock (line 43) | private void ParseStringBlock(string value)
method ParseArgumentFullArgs (line 58) | private void ParseArgumentFullArgs(string value)
method ParseArgumentArgs (line 62) | private void ParseArgumentArgs(string value)
method ParseExecuteArgs (line 70) | private void ParseExecuteArgs(string value)
method ReadLiteralString (line 78) | private string ReadLiteralString(string value)
method ReadNumberToString (line 91) | private string ReadNumberToString(string value)
method GetSubArgument (line 103) | private string GetSubArgument(string value)
method ExecuteActionOn (line 112) | public void ExecuteActionOn(T instance)
FILE: Sync/Tools/Configuration.cs
class DefaultConfiguration (line 9) | public class DefaultConfiguration : IConfigurable
method onConfigurationLoad (line 39) | public void onConfigurationLoad()
method onConfigurationReload (line 44) | public void onConfigurationReload()
method onConfigurationSave (line 49) | public void onConfigurationSave()
method DefaultConfiguration (line 56) | static DefaultConfiguration()
FILE: Sync/Tools/ConfigurationAttribute/BaseConfigurationAttribute.cs
class BaseConfigurationAttribute (line 12) | [System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple =...
method Check (line 21) | public abstract bool Check(string value);
method CheckFailedNotify (line 22) | public void CheckFailedNotify(object obj) => IO.CurrentIO.WriteColor($...
FILE: Sync/Tools/ConfigurationAttribute/BoolAttribute.cs
class BoolAttribute (line 9) | public class BoolAttribute : BaseConfigurationAttribute
method Check (line 11) | public override bool Check(string value) => bool.TryParse(value,out _);
FILE: Sync/Tools/ConfigurationAttribute/ClientAndSourceAttribute.cs
class ClientListAttribute (line 12) | class ClientListAttribute : ListAttribute
class SourceListAttribute (line 17) | class SourceListAttribute : ListAttribute
FILE: Sync/Tools/ConfigurationAttribute/ColorAttribute.cs
class ColorAttribute (line 10) | public class ColorAttribute : BaseConfigurationAttribute
method Check (line 13) | public override bool Check(string rgba)
FILE: Sync/Tools/ConfigurationAttribute/ConfigurationHolderAttribute.cs
class ConfigurationHolderAttribute (line 9) | [System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = fa...
FILE: Sync/Tools/ConfigurationAttribute/FloatAttribute.cs
class FloatAttribute (line 9) | public class FloatAttribute : BaseConfigurationAttribute
method Check (line 15) | public override bool Check(string o)
FILE: Sync/Tools/ConfigurationAttribute/FontAttribute.cs
class FontAttribute (line 9) | public class FontAttribute : BaseConfigurationAttribute
method Check (line 11) | public override bool Check(string value)
FILE: Sync/Tools/ConfigurationAttribute/GuiLanguageElement.cs
type GuiLanguageElement (line 9) | public struct GuiLanguageElement
method GuiLanguageElement (line 13) | public GuiLanguageElement(string defaultVal)
method ToString (line 28) | public override string ToString()
FILE: Sync/Tools/ConfigurationAttribute/IntegerAttribute.cs
class IntegerAttribute (line 9) | public class IntegerAttribute : BaseConfigurationAttribute
method Check (line 14) | public override bool Check(string i)
FILE: Sync/Tools/ConfigurationAttribute/ListAttribute.cs
class ListAttribute (line 9) | public class ListAttribute : BaseConfigurationAttribute
method Check (line 18) | public override bool Check(string val)
method ContainValue (line 48) | private bool ContainValue(string content)
FILE: Sync/Tools/ConfigurationAttribute/PathAttribute.cs
class PathAttribute (line 10) | public class PathAttribute : BaseConfigurationAttribute
method Check (line 19) | public override bool Check(string file_path)
FILE: Sync/Tools/ConfigurationAttribute/StringAttribute.cs
class StringAttribute (line 9) | public class StringAttribute : BaseConfigurationAttribute
method Check (line 11) | public override bool Check(string value) => true;
FILE: Sync/Tools/ConfigurationIO.cs
class ConfigurationIO (line 13) | static class ConfigurationIO
type DefaultConfig (line 18) | public enum DefaultConfig
method ConfigurationIO (line 30) | static ConfigurationIO()
method GetPrivateProfileString (line 55) | [DllImport("kernel32")]
method WritePrivateProfileString (line 58) | [DllImport("kernel32")]
method IniReadValue (line 76) | internal static string IniReadValue(string FilePath, string key, strin...
method IniWriteValue (line 83) | internal static bool IniWriteValue(string FilePath, string key, string...
method Read (line 93) | public static string Read(string key, string column = "config")
method ReadConfig (line 102) | public static string ReadConfig(DefaultConfig key)
method Write (line 113) | public static bool Write(string key, string value, string column = "co...
method WriteConfig (line 123) | public static bool WriteConfig(DefaultConfig key, string value)
FILE: Sync/Tools/I18n.cs
class DefaultI18n (line 9) | public class DefaultI18n : I18nProvider
type I18nProvider (line 145) | public interface I18nProvider
type LanguageElement (line 149) | public struct LanguageElement
method LanguageElement (line 153) | public LanguageElement(string defaultVal)
method ToString (line 168) | public override string ToString()
class I18n (line 177) | public class I18n
method SwitchToCulture (line 213) | public static void SwitchToCulture(string CultureName)
method I18n (line 222) | private I18n()
method I18n (line 230) | private I18n(string CultureName)
method ApplyLanguage (line 237) | public void ApplyLanguage(I18nProvider instance)
method ToString (line 266) | public override string ToString() => $"CurrentLanguage={CurrentLanguag...
FILE: Sync/Tools/IConfigurable.cs
type IConfigurable (line 9) | public interface IConfigurable
method onConfigurationLoad (line 14) | void onConfigurationLoad();
method onConfigurationSave (line 18) | void onConfigurationSave();
method onConfigurationReload (line 22) | void onConfigurationReload();
FILE: Sync/Tools/PluginConfiuration.cs
class ConfigurationElement (line 15) | public sealed class ConfigurationElement
method ConfigurationElement (line 19) | public ConfigurationElement()
method ConfigurationElement (line 24) | public ConfigurationElement(string def)
method ToString (line 39) | public override string ToString()
method ToBool (line 44) | public bool ToBool() => _cfg.ToLower() == "true";
method ToInt (line 45) | public int ToInt() => int.Parse(_cfg);
method ToFloat (line 46) | public float ToFloat() => float.Parse(_cfg);
class PluginConfiuration (line 52) | internal sealed class PluginConfiuration
method PluginConfiuration (line 58) | public PluginConfiuration(Plugin instance, IConfigurable config):this(...
method PluginConfiuration (line 63) | internal PluginConfiuration(string name, IConfigurable config)
method Load (line 75) | internal void Load()
method ForceLoad (line 102) | internal void ForceLoad()
method CheckValueVaild (line 108) | private bool CheckValueVaild(PropertyInfo info, ConfigurationElement e...
method ForceReload (line 126) | internal void ForceReload()
method ForceSave (line 133) | internal void ForceSave()
class PluginConfigurationManager (line 149) | public sealed class PluginConfigurationManager
method PluginConfigurationManager (line 157) | public PluginConfigurationManager(Plugin plugin):this(plugin.Name)
method PluginConfigurationManager (line 162) | internal PluginConfigurationManager(string name)
method AddItem (line 169) | public void AddItem(IConfigurable Config)
method ReloadAll (line 174) | internal void ReloadAll()
method SaveAll (line 182) | public void SaveAll()
FILE: Sync/Tools/SentryHelper.cs
class ErrorRepoter (line 19) | public abstract class ErrorRepoter<T> where T : Plugin
method ErrorRepoter (line 22) | public ErrorRepoter()
method ReportException (line 27) | public void ReportException(Exception e) => errorHandler(e);
class SentryHelper (line 33) | internal class SentryHelper
method SentryHelper (line 42) | private SentryHelper()
method RegisterErrorReporter (line 46) | internal Action<Exception> RegisterErrorReporter(Type type)
method Error (line 63) | internal void Error(string logger, string version, Exception e, bool s...
method RepoterError (line 85) | internal void RepoterError(Exception e, bool silent = false) => Error(...
FILE: Sync/Tools/StartupArgument.cs
class StartupArgument (line 9) | internal static class StartupArgument
method ForceStartArg (line 11) | private static Action<StartupHelper> ForceStartArg(string arg) => (_) ...
method NeedUpdateSyncArg (line 12) | private static Action<StartupHelper> NeedUpdateSyncArg(string arg) => ...
FILE: Sync/Tools/StartupHelper.cs
class StartupHelper (line 14) | public class StartupHelper
method SetConsoleCtrlHandler (line 19) | [DllImport("kernel32.dll")]
method HandlerRoutine (line 23) | private static bool HandlerRoutine(int CtrlType)
method SyncInstanceLocker (line 32) | private void SyncInstanceLocker(MemoryMappedFile syncMappedFile, bool ...
method PreInitSync (line 77) | static void PreInitSync()
method InitSync (line 83) | static void InitSync()
method StartupHelper (line 112) | internal StartupHelper(string[] args)
method Start (line 117) | internal void Start()
FILE: Sync/Tools/StringElement.cs
type StringElement (line 8) | public struct StringElement
method StringElement (line 14) | public StringElement(string perfix, string text, string suffix)
method StringElement (line 22) | public StringElement(string perfix, string text)
method StringElement (line 30) | public StringElement(string source)
method ToString (line 84) | public override string ToString()
FILE: Sync/Tools/SyncIO/ConsoleWriter.cs
type ISyncIO (line 5) | [Obsolete]
type ISyncConsoleWriter (line 10) | public interface ISyncConsoleWriter : ISyncOutput, ISyncInput
type ISyncOutput (line 14) | public interface ISyncOutput
method Write (line 16) | void Write(string msg, bool newline = true, bool time = true);
method WriteColor (line 18) | void WriteColor(string text, ConsoleColor color, bool newline = true, ...
method WriteHelp (line 20) | void WriteHelp(string cmd, string desc);
method WriteHelp (line 22) | void WriteHelp();
method WriteStatus (line 24) | void WriteStatus();
method WriteWelcome (line 26) | void WriteWelcome();
method Clear (line 28) | void Clear();
type ISyncInput (line 31) | public interface ISyncInput
method ReadCommand (line 33) | string ReadCommand();
class IO (line 36) | public static class IO
method SetIO (line 42) | [Obsolete("Obsoleted, instead with AddOutput and SetInput", true)]
method SetIO (line 49) | public static void SetIO(ISyncConsoleWriter specIO)
method IO (line 55) | static IO()
method AddOutput (line 69) | public static void AddOutput(ISyncOutput output) => CurrentIO.AddOutpu...
method SetInput (line 71) | public static void SetInput(ISyncInput input) => CurrentIO.SetInput(in...
FILE: Sync/Tools/SyncIO/FileLoggerWriter.cs
class FileLoggerWriter (line 7) | public class FileLoggerWriter : ISyncOutput
method FileLoggerWriter (line 11) | internal FileLoggerWriter()
method Clear (line 33) | public void Clear()
method Write (line 37) | public void Write(string msg, bool newline = true, bool time = true)
method WriteColor (line 53) | public void WriteColor(string text, ConsoleColor color, bool newline =...
method WriteHelp (line 58) | public void WriteHelp(string cmd, string desc)
method WriteHelp (line 62) | public void WriteHelp()
method WriteStatus (line 66) | public void WriteStatus()
method WriteWelcome (line 70) | public void WriteWelcome()
FILE: Sync/Tools/SyncIO/IOWrapper.cs
class IOWrapper (line 6) | public sealed class IOWrapper : ISyncConsoleWriter
method Clear (line 11) | public void Clear() => currOs.ForEach(p => p.Clear());
method ReadCommand (line 13) | public string ReadCommand() => currI.ReadCommand();
method Write (line 15) | public void Write(string msg, bool newline = true, bool time = true) =...
method WriteColor (line 17) | public void WriteColor(string text, ConsoleColor color, bool newline =...
method WriteHelp (line 19) | public void WriteHelp(string cmd, string desc) => currOs.ForEach(p => ...
method WriteHelp (line 21) | public void WriteHelp() => currOs.ForEach(p => p.WriteHelp());
method WriteStatus (line 23) | public void WriteStatus() => currOs.ForEach(p => p.WriteStatus());
method WriteWelcome (line 25) | public void WriteWelcome() => currOs.ForEach(p => p.WriteWelcome());
method SetInput (line 27) | internal void SetInput(ISyncInput input)
method AddOutput (line 32) | internal void AddOutput(ISyncOutput output)
FILE: Sync/Tools/SyncIO/Logger.cs
type LogType (line 5) | public enum LogType
class Logger (line 12) | public class Logger
method Logger (line 24) | public Logger(string prefix, ISyncOutput output = null)
method Log (line 30) | public void Log(string message, LogType type) => output?.WriteColor($"...
method LogInfomation (line 32) | public void LogInfomation(string message) => Log(message, LogType.Info...
method LogWarning (line 34) | public void LogWarning(string message) => Log(message, LogType.Warning);
method LogError (line 36) | public void LogError(string message) => Log(message, LogType.Error);
method Logger (line 41) | public Logger(ISyncOutput output = null) : base(typeof(T).Name, output)
class Logger (line 39) | public class Logger<T> : Logger
method Logger (line 24) | public Logger(string prefix, ISyncOutput output = null)
method Log (line 30) | public void Log(string message, LogType type) => output?.WriteColor($"...
method LogInfomation (line 32) | public void LogInfomation(string message) => Log(message, LogType.Info...
method LogWarning (line 34) | public void LogWarning(string message) => Log(message, LogType.Warning);
method LogError (line 36) | public void LogError(string message) => Log(message, LogType.Error);
method Logger (line 41) | public Logger(ISyncOutput output = null) : base(typeof(T).Name, output)
FILE: Sync/Tools/SyncIO/NConsoleWriter.cs
class NConsoleWriter (line 6) | public class NConsoleWriter : ISyncConsoleWriter, ISyncOutput, ISyncInput
method ReadCommand (line 14) | public string ReadCommand()
method Write (line 26) | public void Write(string msg, bool newline = true, bool time = true)
method WriteColor (line 55) | public void WriteColor(string text, ConsoleColor color, bool newline =...
method WriteHelp (line 67) | public void WriteHelp(string cmd, string desc)
method WriteStatus (line 76) | public void WriteStatus()
method WriteWelcome (line 85) | public void WriteWelcome()
method WriteHelp (line 96) | public void WriteHelp()
method Clear (line 111) | public void Clear()
FILE: Sync/Tools/Updater.cs
class Updater (line 13) | static class Updater
method ApplyUpdate (line 26) | public static bool ApplyUpdate(bool needUpdate)
FILE: Sync/Tools/Utils/ConfigurationHelper.cs
class ConfigurationHelper (line 12) | public static class ConfigurationHelper
method TryGetConfigurationElement (line 21) | public static bool TryGetConfigurationElement(string main_section_name...
FILE: Sync/Tools/Utils/PluginsHelper.cs
class PluginsHelper (line 10) | public static class PluginsHelper
method TryGetPlugin (line 12) | public static bool TryGetPlugin<T>(out T plugin) where T : Plugin
Condensed preview — 125 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (296K chars).
[
{
"path": ".gitignore",
"chars": 2192,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
},
{
"path": ".gitmodules",
"chars": 100,
"preview": "[submodule \"OfficalPlugins\"]\n\tpath = OfficalPlugins\n\turl = https://github.com/Deliay/SyncPlugin.git\n"
},
{
"path": "LICENSE",
"chars": 1069,
"preview": "MIT License\n\nCopyright (c) 2017-2018 OsuSync\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "Language/de-DE/BanManagerPlugin.DefaultLanguage.lang",
"chars": 497,
"preview": "[de-DE]\nLANG_HELP_BAN=Sperre Benutzer/ID/Regex ,Nachrichten werden über IRC versendet.\nLANG_HELP_UNBAN=Entsperre Benutze"
},
{
"path": "Language/de-DE/BeatmapSuggest.DefaultLanguage.lang",
"chars": 1079,
"preview": "[de-DE]\nLANG_GET_BEATMAP_FAILED=Erhalten von Beatmap Metadaten {0} schlug fehl,Fehlermeldung: {1}.\nLANG_SUGGEST_MEG={0} "
},
{
"path": "Language/de-DE/ConfigGUI.DefaultLanguage.lang",
"chars": 289,
"preview": "[de-DE]\nBUTTON_OPEN=Öffne\nBUTTON_BROWSE=Durchsuche\nBUTTON_FONT=Schriftart\nBUTTON_COLOR=Farbe\nWINDOW_TITLE=Konfiguration\n"
},
{
"path": "Language/de-DE/DefaultGUI.Language.lang",
"chars": 509,
"preview": "[de-DE]\nUI_DISPLAY=Öffne die UI\nUI_TIPS_BOTIRC=BotIRC\nUI_TIPS_BOTIRC_PASS=IRC Passwort\nUI_TIPS_STATUS=Status\nUI_TIPS_DAN"
},
{
"path": "Language/de-DE/DefaultPlugin.Language.lang",
"chars": 3756,
"preview": "[de-DE]\nLANG_COMMANDS_LOGIN=login Benutzername> [Passwort] um Nachrichten zur Quelle zu versenden.\nLANG_COMMANDS_EXIT=Ar"
},
{
"path": "Language/de-DE/NowPlaying.Languages.lang",
"chars": 688,
"preview": "[de-DE]\nOSU_PATH_NOT_SET=osu! Pfad ist leer. Die Anwendung sucht nach einer laufenden osu! Instanz.\nFIND_OSU_PATH=Kann d"
},
{
"path": "Language/de-DE/OsuRTDataProvider.DefaultLanguage.lang",
"chars": 1150,
"preview": "[de-DE]\nLANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]Kann den osu!.exe Prozess nicht finden.\nLANG_OSU_FOUND=[OsuRTDataP"
},
{
"path": "Language/de-DE/RealTimePPDisplayer.DefaultLanguage.lang",
"chars": 174,
"preview": "[de-DE]\nUI_MENU_TOPMOST=Oberste\nTEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP Datei: {0}\nMMF_MODE_OUTPUT_PATH_FOR"
},
{
"path": "Language/de-DE/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 1426,
"preview": "[de-DE]\nLANG_HELP=\\nDies ist eine Hilfe für IRC Befehle. Hänge dazu ein \"?\" am Anfang der Nachrichten ein.\\nrecently --s"
},
{
"path": "Language/de-DE/Sync.Tools.DefaultI18n.lang",
"chars": 8904,
"preview": "[de-DE]\nLANG_Loading=Lade....\nLANG_Plugins={0:D} Plugins geladen.\nLANG_Sources={0:D} Quellen geladen.\nLANG_Client={0:D} "
},
{
"path": "Language/en-US/BanManagerPlugin.DefaultLanguage.lang",
"chars": 390,
"preview": "[en-US]\r\nLANG_HELP_BAN=ban user/id/regex ,message will be sent to irc\r\nLANG_HELP_UNBAN=unban user/id/regex\r\nLANG_HELP_WH"
},
{
"path": "Language/en-US/BeatmapSuggest.DefaultLanguage.lang",
"chars": 850,
"preview": "[en-US]\nLANG_GET_BEATMAP_FAILED=Get beatmap info {0} failed,message:{1}\nLANG_SUGGEST_MEG={0} want you to play the beatma"
},
{
"path": "Language/en-US/ConfigGUI.DefaultLanguage.lang",
"chars": 233,
"preview": "[en-us]\nBUTTON_OPEN=Open\nBUTTON_BROWSE=Browse\nBUTTON_FONT=Font\nBUTTON_COLOR=Color\nWINDOW_TITLE=Config\nBUTTON_SAVE=Save\nL"
},
{
"path": "Language/en-US/DefaultGUI.Language.lang",
"chars": 468,
"preview": "[en-US]\r\nUI_DISPLAY=Show UI\r\nUI_TIPS_BOTIRC=BotIRC\r\nUI_TIPS_BOTIRC_PASS=IRC PW\r\nUI_TIPS_STATUS=Status\r\nUI_TIPS_DANMAKU=L"
},
{
"path": "Language/en-US/DefaultPlugin.Language.lang",
"chars": 3326,
"preview": "[en-US]\r\nLANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source\r\nLANG_COMMANDS_EXIT=Stop work"
},
{
"path": "Language/en-US/NowPlaying.Languages.lang",
"chars": 642,
"preview": "[en-US]\r\nOSU_PATH_NOT_SET=osu! path is empty, program will search the running osu! instance.\r\nFIND_OSU_PATH=Can't find o"
},
{
"path": "Language/en-US/OsuRTDataProvider.DefaultLanguage.lang",
"chars": 963,
"preview": "[en-US]\r\nLANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]Cannot find osu!.exe process\r\nLANG_OSU_FOUND=[OsuRTDataProvider]["
},
{
"path": "Language/en-US/RealTimePPDisplayer.DefaultLanguage.lang",
"chars": 173,
"preview": "[en-US]\r\nUI_MENU_TOPMOST=Topmost\r\nTEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP File: {0}\r\nMMF_MODE_OUTPUT_PATH_F"
},
{
"path": "Language/en-US/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 1216,
"preview": "[en-US]\r\nLANG_HELP=\\nThis is a help for osu!irc common commands(in osu!irc please add \"?\" at the beginning of commands)\\"
},
{
"path": "Language/en-US/Sync.Tools.DefaultI18n.lang",
"chars": 6289,
"preview": "[en-US]\r\nLANG_Loading=Loading....\r\nLANG_Plugins=Loaded {0:D} Plugins\r\nLANG_Sources=Loaded {0:D} Sources\r\nLANG_Client=Loa"
},
{
"path": "Language/hu-HU/BanManagerPlugin.DefaultLanguage.lang",
"chars": 509,
"preview": "[hu-HU]\nLANG_HELP_BAN=ban user/id/regex , felhasznl kitiltsa, zenet kldve lesz IRC-re is\nLANG_HELP_UNBAN=unban user/id/r"
},
{
"path": "Language/hu-HU/DefaultGUI.Language.lang",
"chars": 462,
"preview": "[hu-HU]\nUI_DISPLAY=Fellet mutatsa\nUI_TIPS_BOTIRC=BotIRC\nUI_TIPS_BOTIRC_PASS=IRC Jelsz\nUI_TIPS_STATUS=Sttusz\nUI_TIPS_DANM"
},
{
"path": "Language/hu-HU/DefaultPlugin.Language.lang",
"chars": 3105,
"preview": "[hu-HU]\nLANG_COMMANDS_LOGIN=login <user> [pass] login to source to send message to source\nLANG_COMMANDS_EXIT=Folyamatok "
},
{
"path": "Language/hu-HU/NowPlaying.Languages.lang",
"chars": 682,
"preview": "[hu-HU]\nOSU_PATH_NOT_SET=osu! megadott elrsi helye res, a program prblja megkeresni a fut osu! alkalmazst.\nFIND_OSU_PATH"
},
{
"path": "Language/hu-HU/OsuRTDataProvider.DefaultLanguage.lang",
"chars": 974,
"preview": "[hu-HU]\nLANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0} osu!.exe folyamat nem tallhat\nLANG_OSU_FOUND=[OsuRTDataProvider][I"
},
{
"path": "Language/hu-HU/RealTimePPDisplayer.DefaultLanguage.lang",
"chars": 172,
"preview": "[hu-HU]\nUI_MENU_TOPMOST=Legnagyobb\nTEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP File: {0}\nMMF_MODE_OUTPUT_PATH_F"
},
{
"path": "Language/hu-HU/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 1231,
"preview": "[hu-HU]\nLANG_HELP=\\nEz egy sg az osu!irc ltalnos parancsaihoz(osu!irc-ben krlek hasznlj \"?\" eltagot a parancso keltt)\\nr"
},
{
"path": "Language/hu-HU/Sync.Tools.DefaultI18n.lang",
"chars": 2816,
"preview": "[hu-HU]\nLANG_Loading=Betlts...\nLANG_Plugins=Betltve {0:D} Plugin\nLANG_Sources=Betltve {0:D} Platform\nLANG_Client=Betltve"
},
{
"path": "Language/ja-JP/BanManagerPlugin.DefaultLanguage.lang",
"chars": 290,
"preview": "[ja-JP]\nLANG_HELP_BAN=ban user/id/regex ,bZ[WIRCɑM܂\nLANG_HELP_UNBAN=unban user/id/regex\nLANG_HELP_WHITELIST=add user/id/"
},
{
"path": "Language/ja-JP/BeatmapSuggest.DefaultLanguage.lang",
"chars": 649,
"preview": "[ja-JP]\nLANG_GET_BEATMAP_FAILED={0} r[g}bv̏̎擾Ɏs܂BG[bZ[W: {1}\nLANG_SUGGEST_MEG={0} r[g}bvvCꍇ [{1} {2}] || [{3} dl] || [{4"
},
{
"path": "Language/ja-JP/ConfigGUI.DefaultLanguage.lang",
"chars": 176,
"preview": "[ja-JP]\nBUTTON_OPEN=J\nBUTTON_BROWSE=Q\nBUTTON_FONT=tHg\nBUTTON_COLOR=F\nWINDOW_TITLE=ݒ\nBUTTON_SAVE=ۑ\nLABEL_SAVED=ۑ܂I\nLABEL_"
},
{
"path": "Language/ja-JP/DefaultGUI.Language.lang",
"chars": 372,
"preview": "[ja-JP]\nUI_DISPLAY=UI\\\nUI_TIPS_BOTIRC=BotIRC\nUI_TIPS_BOTIRC_PASS=IRC pX[h\nUI_TIPS_STATUS=Xe[^X\nUI_TIPS_DANMAKU=LiveID\nUI"
},
{
"path": "Language/ja-JP/DefaultPlugin.Language.lang",
"chars": 2708,
"preview": "[ja-JP]\nLANG_COMMANDS_LOGIN=login <[U[> [pX[h] Ń\\[XɃOCăbZ[W𑗐M܂\nLANG_COMMANDS_EXIT=Sync~ďI܂\nLANG_COMMANDS_CLEAR=\\Ă郍OZbg܂\n"
},
{
"path": "Language/ja-JP/NowPlaying.Languages.lang",
"chars": 471,
"preview": "[ja-JP]\nOSU_PATH_NOT_SET=osu!̃pXݒ肳Ă܂Asosu!̃CX^X܂\nFIND_OSU_PATH=osu!̃pX邱Ƃł܂I {0:S}\nOSU_PATH_FAIL=osu!̃pX邱Ƃł܂Aڍ̕\\͖ɂȂĂ܂B"
},
{
"path": "Language/ja-JP/OsuRTDataProvider.DefaultLanguage.lang",
"chars": 792,
"preview": "[ja-JP]\nLANG_OSU_NOT_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exevZX܂ł\nLANG_OSU_FOUND=[OsuRTDataProvider][ID:{0}]osu!.exev"
},
{
"path": "Language/ja-JP/RealTimePPDisplayer.DefaultLanguage.lang",
"chars": 151,
"preview": "[ja-JP]\nUI_MENU_TOPMOST=ŏ\nTEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer]PP t@C: {0}\nMMF_MODE_OUTPUT_PATH_FORMAT=[Rea"
},
{
"path": "Language/ja-JP/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 699,
"preview": "[ja-JP]\nLANG_HELP=\\nosu!IRC̃R}hwvł(osu!IRCł̓R}h̐擪 ? ljĂ)\\nrecently --status | ݂̃Xe[^XO擾܂(osu!IRCł͎gps)\\nrecently --u <[U["
},
{
"path": "Language/ja-JP/Sync.Tools.DefaultI18n.lang",
"chars": 4250,
"preview": "[ja-JP]\nLANG_Loading=Ǎ...\nLANG_Plugins={0:D} ̃vOCǂݍ݂܂\nLANG_Sources={0:D} ̃\\[Xǂݍ݂܂\nLANG_Client={0:D} ̃NCAgǂݍ݂܂\nLANG_Er"
},
{
"path": "Language/ru-RU/BanManagerPlugin.DefaultLanguage.lang",
"chars": 223,
"preview": "[ru-RU]\nLANG_HELP_BAN= /id/regex , irc\nLANG_HELP_UNBAN= /id/regex\nLANG_HELP_WHITELIST= /id/regex , irc\nLANG_H"
},
{
"path": "Language/ru-RU/BeatmapSuggest.DefaultLanguage.lang",
"chars": 552,
"preview": "[ru-RU]\nLANG_GET_BEATMAP_FAILED= {0} ,: {1}\nLANG_SUGGEST_MEG={0} , [{1} {2}] || [{3} dl] || [{4} mirror] \"?dl\"/"
},
{
"path": "Language/ru-RU/ConfigGUI.DefaultLanguage.lang",
"chars": 275,
"preview": "[ru-RU]\nBUTTON_OPEN=\nBUTTON_BROWSE=\nBUTTON_FONT=\nBUTTON_COLOR=\nWINDOW_TITLE=\nWINDOW_TITLE_REQUIRE_RESTART= \nBUTTON_S"
},
{
"path": "Language/ru-RU/DefaultGUI.Language.lang",
"chars": 344,
"preview": "[ru-RU]\nUI_DISPLAY= UI\nUI_TIPS_BOTIRC=BotIRC\nUI_TIPS_BOTIRC_PASS= IRC\nUI_TIPS_STATUS=\nUI_TIPS_DANMAKU=LiveID\nUI_TIPS_OS"
},
{
"path": "Language/ru-RU/DefaultPlugin.Language.lang",
"chars": 2246,
"preview": "[ru-RU]\nLANG_COMMANDS_LOGIN=login <> [] \nLANG_COMMANDS_EXIT= \nLANG_COMMANDS_CLEAR= \nLANG_COMMANDS_STATUS= \nLA"
},
{
"path": "Language/ru-RU/NowPlaying.Languages.lang",
"chars": 431,
"preview": "[ru-RU]\nOSU_PATH_NOT_SET= osu! , osu!.\nFIND_OSU_PATH= osu! {0:S}\nOSU_PATH_FAIL= osu!, .\nERROR_WHILE_FIND"
},
{
"path": "Language/ru-RU/OsuRTDataProvider.DefaultLanguage.lang",
"chars": 899,
"preview": "[ru-RU]\nLANG_OSU_NOT_FOUND=[ID:{0}] osu!.exe\nLANG_OSU_FOUND=[ID:{0}] osu!.exe \nLANG_INIT_PLAY_FINDER_FAILED=[ID:{0}] "
},
{
"path": "Language/ru-RU/RealTimePPDisplayer.DefaultLanguage.lang",
"chars": 1563,
"preview": "[ru-RU]\nUI_MENU_TOPMOST= \nTEXT_MODE_OUTPUT_PATH_FORMAT=[RealTimePPDisplayer] pp: {0}\nMMF_MODE_OUTPUT_PATH_FORMAT=[Rea"
},
{
"path": "Language/ru-RU/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 655,
"preview": "[ru-RU]\nLANG_HELP=\\n osu!irc ( osu!irc , , \"?\" )\\nrecently --status | ( osu!irc)\\nrecently --u <userName> | "
},
{
"path": "Language/ru-RU/Sync.Tools.DefaultI18n.lang",
"chars": 3780,
"preview": "[ru-RU]\nLANG_Loading=...\nLANG_Plugins= {0:D} (-)\nLANG_Sources= {0:D} (-)\nLANG_Client= {0:D} (-)\nLANG_Error=CAN NOT INITI"
},
{
"path": "Language/zh-CN/BanManagerPlugin.DefaultLanguage.lang",
"chars": 226,
"preview": "[zh-CN]\nLANG_HELP_BAN=ֹijuser/id/regexϢirc\nLANG_HELP_UNBAN=ֹijuser/id/regex\nLANG_HELP_WHITELIST=ijuser/id/regex˽һֱȨϢirc\nLA"
},
{
"path": "Language/zh-CN/DefaultGUI.Language.lang",
"chars": 323,
"preview": "[zh-CN]\nUI_DISPLAY=ʾUI\nUI_TIPS_BOTIRC=BotIRC\nUI_TIPS_BOTIRC_PASS=IRC\nUI_TIPS_STATUS=״̬\nUI_TIPS_DANMAKU=ֱĻ\nUI_TIPS_OSU_IR"
},
{
"path": "Language/zh-CN/DefaultPlugin.Language.lang",
"chars": 2004,
"preview": "[zh-CN]\nLANG_COMMANDS_LOGIN=login <user> [pass] ¼Ŀ굯ĻվĻ\nLANG_COMMANDS_EXIT=˳\nLANG_COMMANDS_CLEAR=Ļ\nLANG_COMMANDS_STATUS="
},
{
"path": "Language/zh-CN/NowPlaying.Languages.lang",
"chars": 429,
"preview": "[zh-CN]\nOSU_PATH_NOT_SET=δosuļ·ѰǰеosuԶ\nFIND_OSU_PATH=ҵosu·! {0:S}\nOSU_PATH_FAIL=δosuļ·Ҳûеosuʹô˲ܣú·osuSyncܼʹ\nERROR_WHIL"
},
{
"path": "Language/zh-CN/RecentlyUserQuery.DefaultLanguage.lang",
"chars": 633,
"preview": "[zh-CN]\nLANG_HELP=\\nָcmd˺osu!irc˹ͨ(osu!ircڿͷ\"?\")\\nrecently --status |ȡǰϢ¼״̬Ϣ(osu!irc)\\nrecently --u <userName> |ȡû<userN"
},
{
"path": "Language/zh-CN/Sync.Tools.DefaultI18n.lang",
"chars": 1556,
"preview": "[zh-CN]\nLANG_Loading=ȡ....\nLANG_Plugins= {0:D} \nLANG_Sources= {0:D} ֱԴ\nLANG_Client= {0:D} Client\nLANG_Error=ܳʼȷǷѾװֱԴ."
},
{
"path": "README.md",
"chars": 412,
"preview": "# Sync\n\n\n\n## [Download Releases](https://github.com/OsuSync/Sync/releases) , [Us"
},
{
"path": "Sync/Client/ClientEvent.cs",
"chars": 1367,
"preview": "using Sync.MessageFilter;\nusing Sync.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing "
},
{
"path": "Sync/Client/ClientManager.cs",
"chars": 1233,
"preview": "using Sync.MessageFilter;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing S"
},
{
"path": "Sync/Client/ClientWorkWrapper.cs",
"chars": 1247,
"preview": "using Sync.Tools;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing Syst"
},
{
"path": "Sync/Client/DefaultReciveClient.cs",
"chars": 1716,
"preview": "using Sync.MessageFilter;\nusing Sync.Plugins;\nusing Sync.Source;\nusing System;\nusing System.Collections.Generic;\nusing "
},
{
"path": "Sync/Command/CommandDispatch.cs",
"chars": 2395,
"preview": "using System;\nusing System.Collections.Generic;\n\nnamespace Sync.Command\n{\n /// <summary>\n /// Delegate for one Co"
},
{
"path": "Sync/Command/CommandManager.cs",
"chars": 1286,
"preview": "using Sync.Tools;\nusing static Sync.Tools.DefaultI18n;\nusing System;\n\nnamespace Sync.Command\n{\n /// <summary>\n //"
},
{
"path": "Sync/Dependence/config.ini",
"chars": 94,
"preview": "[config]\nLiveRoomID=0\nTargetIRC=noname\nBotIRC=noname\nBotIRCPassword=password\nProvider=BiliBili"
},
{
"path": "Sync/Event/EventDispatcher.cs",
"chars": 10405,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing Sys"
},
{
"path": "Sync/MessageFilter/FilterBase.cs",
"chars": 3326,
"preview": "using System;\nusing Sync.Source;\nusing Sync.Tools;\nusing static Sync.Tools.DefaultI18n;\nusing Sync.Plugins;\n\nnamespace "
},
{
"path": "Sync/MessageFilter/FilterManager.cs",
"chars": 4065,
"preview": "using Sync.MessageFilter;\r\nusing Sync.Source;\r\nusing Sync.Tools;\r\nusing System;\r\nusing System.Text;\r\nusing System.Colle"
},
{
"path": "Sync/MessageFilter/FilterPriorityAttribute.cs",
"chars": 837,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/MessageFilter/MessageDispatcher.cs",
"chars": 4354,
"preview": "using Sync.Client;\nusing Sync.MessageFilter;\nusing Sync.Source;\nusing Sync.Tools;\nusing System;\nusing System.Collection"
},
{
"path": "Sync/MessageFilter/MessageManager.cs",
"chars": 6748,
"preview": "using Sync.Plugins;\nusing Sync.Tools;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.T"
},
{
"path": "Sync/Plugins/Plugin.cs",
"chars": 1093,
"preview": "using Sync.Command;\nusing System;\nusing System.Reflection;\n\nnamespace Sync.Plugins\n{\n public abstract class Plugin\n "
},
{
"path": "Sync/Plugins/PluginManager.cs",
"chars": 22331,
"preview": "using Sync.Client;\nusing Sync.Command;\nusing Sync.Source;\nusing Sync.Tools;\nusing System;\nusing System.Collections.Gene"
},
{
"path": "Sync/Program.cs",
"chars": 611,
"preview": "using SharpRaven;\nusing Sync.Tools;\nusing System;\nusing System.Threading;\n\nnamespace Sync\n{\n public static class Pro"
},
{
"path": "Sync/Properties/AssemblyInfo.cs",
"chars": 1642,
"preview": "using System.Reflection;\r\nusing System.Resources;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.Interop"
},
{
"path": "Sync/Properties/Resources.Designer.cs",
"chars": 2435,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// 此代码由工具生成。\n/"
},
{
"path": "Sync/Properties/Resources.resx",
"chars": 5494,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prim"
},
{
"path": "Sync/Properties/Settings.Designer.cs",
"chars": 970,
"preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n// 此代码由工具生成。\n/"
},
{
"path": "Sync/Properties/Settings.settings",
"chars": 193,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n <Profiles>\n "
},
{
"path": "Sync/Resources/App.config",
"chars": 178,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n <startup> \n \n <supportedRuntime version=\"v4.0\" sku="
},
{
"path": "Sync/Source/SourceBase.cs",
"chars": 4089,
"preview": "using Sync.MessageFilter;\nusing Sync.Plugins;\nusing Sync.Tools;\nusing System;\nusing System.Collections;\nusing System.Co"
},
{
"path": "Sync/Source/SourceEvent.cs",
"chars": 2717,
"preview": "using Sync.Client;\nusing Sync.MessageFilter;\nusing Sync.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing "
},
{
"path": "Sync/Source/SourceManager.cs",
"chars": 850,
"preview": "using Sync.Source;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.T"
},
{
"path": "Sync/Source/SourceWorkWrapper.cs",
"chars": 1185,
"preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;"
},
{
"path": "Sync/Sync.csproj",
"chars": 10206,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micro"
},
{
"path": "Sync/SyncHost.cs",
"chars": 4853,
"preview": "using Sync.Command;\nusing Sync.Plugins;\nusing Sync.Tools;\nusing System;\nusing System.Collections.Generic;\nusing static "
},
{
"path": "Sync/Tools/Builtin/CommonCommand.cs",
"chars": 13664,
"preview": "using Sync.Command;\nusing Sync.MessageFilter;\nusing Sync.Plugins;\nusing Sync.Source;\nusing Sync.Tools;\nusing System;\nus"
},
{
"path": "Sync/Tools/Builtin/InternalPlugin.cs",
"chars": 937,
"preview": "using Sync.Command;\r\nusing Sync.Plugins;\r\nusing System;\r\n\r\nnamespace Sync.Tools.Builtin\r\n{\r\n public class InternalPl"
},
{
"path": "Sync/Tools/Builtin/PluginCommand.cs",
"chars": 18461,
"preview": "using Sync.Command;\r\nusing Sync.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\n"
},
{
"path": "Sync/Tools/CommandParser.cs",
"chars": 4039,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/Configuration.cs",
"chars": 1971,
"preview": "using Sync.MessageFilter;\nusing Sync.Tools.ConfigurationAttribute;\n\nnamespace Sync.Tools\n{\n /// <summary>\n /// De"
},
{
"path": "Sync/Tools/ConfigurationAttribute/BaseConfigurationAttribute.cs",
"chars": 845,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing S"
},
{
"path": "Sync/Tools/ConfigurationAttribute/BoolAttribute.cs",
"chars": 318,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/ClientAndSourceAttribute.cs",
"chars": 589,
"preview": "using Sync.Client;\nusing Sync.Plugins;\nusing Sync.Tools.ConfigurationAttribute;\nusing System;\nusing System.Collections."
},
{
"path": "Sync/Tools/ConfigurationAttribute/ColorAttribute.cs",
"chars": 810,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing"
},
{
"path": "Sync/Tools/ConfigurationAttribute/ConfigurationHolderAttribute.cs",
"chars": 415,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/FloatAttribute.cs",
"chars": 606,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/FontAttribute.cs",
"chars": 332,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/GuiLanguageElement.cs",
"chars": 762,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/IntegerAttribute.cs",
"chars": 551,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/ListAttribute.cs",
"chars": 1550,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationAttribute/PathAttribute.cs",
"chars": 757,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Thr"
},
{
"path": "Sync/Tools/ConfigurationAttribute/StringAttribute.cs",
"chars": 298,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/ConfigurationIO.cs",
"chars": 4466,
"preview": "using System;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading;\nusing S"
},
{
"path": "Sync/Tools/I18n.cs",
"chars": 13796,
"preview": "using Sync.Tools.ConfigurationAttribute;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System."
},
{
"path": "Sync/Tools/IConfigurable.cs",
"chars": 578,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/PluginConfiuration.cs",
"chars": 5817,
"preview": "using Sync.Plugins;\nusing Sync.Tools;\nusing Sync.Tools.ConfigurationAttribute;\nusing System;\nusing System.Collections.C"
},
{
"path": "Sync/Tools/SentryHelper.cs",
"chars": 3158,
"preview": "using SharpRaven;\r\nusing SharpRaven.Data;\r\nusing Sync.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing"
},
{
"path": "Sync/Tools/StartupArgument.cs",
"chars": 933,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
},
{
"path": "Sync/Tools/StartupHelper.cs",
"chars": 4597,
"preview": "using Sync.Tools;\nusing System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing Sy"
},
{
"path": "Sync/Tools/StringElement.cs",
"chars": 2111,
"preview": "using System;\n\nnamespace Sync.Tools\n{\n /// <summary>\n /// A helper for a string with a perfix and a suffix\n //"
},
{
"path": "Sync/Tools/SyncIO/ConsoleWriter.cs",
"chars": 1781,
"preview": "using System;\n\nnamespace Sync.Tools\n{\n [Obsolete]\n public interface ISyncIO : ISyncOutput, ISyncInput\n {\n }"
},
{
"path": "Sync/Tools/SyncIO/FileLoggerWriter.cs",
"chars": 2391,
"preview": "using System;\r\nusing System.IO;\r\nusing static Sync.Tools.DefaultI18n;\r\n\r\nnamespace Sync.Tools\r\n{\r\n public class File"
},
{
"path": "Sync/Tools/SyncIO/IOWrapper.cs",
"chars": 1255,
"preview": "using System;\nusing System.Collections.Generic;\n\nnamespace Sync.Tools\n{\n public sealed class IOWrapper : ISyncConsol"
},
{
"path": "Sync/Tools/SyncIO/Logger.cs",
"chars": 1122,
"preview": "using System;\n\nnamespace Sync.Tools\n{\n public enum LogType\n {\n Infomation,\n Warning,\n Error,"
},
{
"path": "Sync/Tools/SyncIO/NConsoleWriter.cs",
"chars": 3704,
"preview": "using System;\r\nusing static Sync.Tools.DefaultI18n;\r\n\r\nnamespace Sync.Tools\r\n{\r\n public class NConsoleWriter : ISync"
},
{
"path": "Sync/Tools/Updater.cs",
"chars": 2626,
"preview": "using Sync.Tools.Builtin;\nusing Sync.Tools;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nu"
},
{
"path": "Sync/Tools/Utils/ConfigurationHelper.cs",
"chars": 1972,
"preview": "using Sync.Plugins;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing "
},
{
"path": "Sync/Tools/Utils/PluginsHelper.cs",
"chars": 442,
"preview": "using Sync.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System."
},
{
"path": "Sync/app.config",
"chars": 158,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Vers"
},
{
"path": "Sync/config.ini",
"chars": 73,
"preview": "[config]\nLiveRoomID=\nTargetIRC=\nBotIRC=\nBotIRCPassword=\nProvider=Bilibili"
},
{
"path": "Sync/packages.config",
"chars": 321,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n <package id=\"Newtonsoft.Json\" version=\"6.0.8\" targetFramework=\"ne"
},
{
"path": "Sync.sln",
"chars": 1320,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.3\nMini"
}
]
// ... and 2 more files (download for full content)
About this extraction
This page contains the full source code of the OsuSync/Sync GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 125 files (264.5 KB), approximately 68.3k tokens, and a symbol index with 447 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.