├── .editorconfig ├── .git-blame-ignore-revs ├── .github ├── dependabot.yml └── workflows │ ├── main.yml │ └── release.yml ├── .gitignore ├── .idea └── .idea.CyclopsChat │ └── .idea │ ├── dictionaries │ └── fried.xml │ └── inspectionProfiles │ └── Project_Default.xml ├── .run └── Cyclops.MainApplication.run.xml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Cyclops.Configuration ├── ConnectionConfig.cs └── Cyclops.Configuration.csproj ├── Cyclops.Console ├── Composition │ └── Module.cs ├── ConsoleWindow.xaml ├── ConsoleWindow.xaml.cs ├── Cyclops.Console.csproj └── ViewModel │ └── ConsoleViewModel.cs ├── Cyclops.Core.Resource ├── Avatars │ ├── AvatarsManager.cs │ └── ImageUtils.cs ├── ChatLogger.cs ├── ChatObjectsValidator.cs ├── Composition │ └── Module.cs ├── Conference.cs ├── ConferenceMember.cs ├── ConferenceUserMessage.cs ├── Cyclops.Core.Resource.csproj ├── FileLogger.cs ├── Helpers │ └── CommonUtility.cs ├── InternalObservableCollection.cs ├── IqCommonHandler.cs ├── JabberNetExtensions │ └── JabberCommonHelper.cs ├── Properties │ └── AssemblyInfo.cs ├── Security │ └── TripleDesStringEncryptor.cs ├── Smiles │ ├── Smile.cs │ ├── SmilePack.cs │ ├── SmilePackMeta.cs │ ├── SmilesManager.cs │ └── note.txt └── UserSession.cs ├── Cyclops.Core ├── Avatars │ └── IAvatarsManager.cs ├── CaptchaSystemMessage.cs ├── Composition │ └── Module.cs ├── CustomEventArgs │ ├── AuthenticationEventArgs.cs │ ├── AvatarChangedEventArgs.cs │ ├── BannedEventArgs.cs │ ├── CaptchaEventArgs.cs │ ├── ConferenceJoinErrorKind.cs │ ├── ConferenceJoinEventArgs.cs │ ├── ConferenceMemberEventArgs.cs │ ├── ConferencesListEventArgs.cs │ ├── ConnectionErrorKind.cs │ ├── DisconnectEventArgs.cs │ ├── ErrorEventArgs.cs │ ├── KickedEventArgs.cs │ ├── NickChangeEventArgs.cs │ ├── OperationResult.cs │ ├── RoleChangedEventArgs.cs │ └── SubjectChangedEventArgs.cs ├── Cyclops.Core.csproj ├── Helpers │ ├── CommonExtensions.cs │ ├── EnumerableExtensions.cs │ ├── ReflectionHelper.cs │ ├── ResourceHelper.cs │ └── TaskEx.cs ├── IChatLogger.cs ├── IChatObjectsValidator.cs ├── IConference.cs ├── IConferenceMember.cs ├── IConferenceMessage.cs ├── IDebugWindow.cs ├── ILogger.cs ├── IObservableCollection.cs ├── ISessionHolder.cs ├── ISynchronizeInvokeHolder.cs ├── IUserSession.cs ├── Modularity │ ├── Bootstrapper.cs │ ├── IModule.cs │ ├── ModuleBase.cs │ └── ServiceLocatorImpl.cs ├── NotifyPropertyChangedBase.cs ├── PrivateMessage.cs ├── Properties │ ├── AssemblyInfo.Shared.cs │ └── AssemblyInfo.cs ├── Resources │ ├── ErrorMessageResources.Designer.cs │ └── ErrorMessageResources.resx ├── Role.cs ├── Security │ └── IStringEncryptor.cs ├── Smiles │ ├── ISmile.cs │ ├── ISmilePack.cs │ ├── ISmilePackMeta.cs │ ├── ISmilesManager.cs │ └── note.txt └── SystemConferenceMessage.cs ├── Cyclops.MainApplication.Localization ├── Common.Designer.cs ├── Common.resx ├── Common.ru-RU.resx ├── Conference.Designer.cs ├── Conference.resx ├── Conference.ru-RU.resx ├── ConferenceList.Designer.cs ├── ConferenceList.resx ├── ConferenceList.ru-RU.resx ├── ContextMenus.Designer.cs ├── ContextMenus.resx ├── ContextMenus.ru-RU.resx ├── Cyclops.MainApplication.Localization.csproj ├── Language.cs ├── LocalizationManager.cs ├── LocalizationResourceDictionary.xaml ├── Login.Designer.cs ├── Login.resx ├── Login.ru-RU.resx ├── Main.Designer.cs ├── Main.resx ├── Properties │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── ResourceWrapper.cs ├── Settings.Designer.cs ├── Settings.resx ├── Settings.ru-RU.resx ├── Vcard.Designer.cs ├── Vcard.resx └── Vcard.ru-RU.resx ├── Cyclops.MainApplication.Options ├── Controls │ ├── NamedSeparator.xaml │ ├── NamedSeparator.xaml.cs │ ├── Selector.xaml │ ├── Selector.xaml.cs │ ├── SoundPlayer.cs │ ├── SoundSelector.xaml │ └── SoundSelector.xaml.cs ├── Cyclops.MainApplication.Options.csproj ├── Helpers │ └── Serializer.cs ├── Model │ ├── ApplicationSettings.Common.cs │ ├── ApplicationSettings.Interface.cs │ ├── ApplicationSettings.Sounds.cs │ ├── ApplicationSettings.Status.cs │ └── ApplicationSettings.cs ├── Properties │ ├── DesignTimeResources.xaml │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Resources │ ├── connect.png │ ├── info.png │ ├── keyboard_key.png │ ├── sound.png │ ├── stop.png │ ├── user1_time.png │ ├── uses.png │ ├── web.png │ └── window_preferences.png ├── ValueConverters │ └── Invertor.cs ├── View │ ├── CommonSettings.xaml │ ├── CommonSettings.xaml.cs │ ├── HotkeysSettings.xaml │ ├── HotkeysSettings.xaml.cs │ ├── InterfaceSettings.xaml │ ├── InterfaceSettings.xaml.cs │ ├── SettingsView.xaml │ ├── SettingsView.xaml.cs │ ├── SoundsSettings.xaml │ ├── SoundsSettings.xaml.cs │ ├── StatusSettings.xaml │ └── StatusSettings.xaml.cs └── ViewModel │ └── SettingsViewModel.cs ├── Cyclops.MainApplication ├── App.xaml ├── App.xaml.cs ├── AppIcon.ico ├── ApplicationContext.cs ├── ChatObjectFactory.cs ├── Composition │ ├── Module.cs │ └── SharpXmppClientModule.cs ├── Configuration │ ├── Profile.cs │ └── ProfileManager.cs ├── Controls │ ├── AnimatedImage.cs │ ├── ApplicationSounds.cs │ ├── ChatFlowDocument.cs │ ├── ChatScrollViewer.cs │ ├── ConferencesTabControl.cs │ ├── InputBindingsManager.cs │ ├── InputBox.cs │ ├── SmilesTable.cs │ └── ToolBarEx.cs ├── Cyclops.MainApplication.csproj ├── Data │ ├── Avatars │ │ └── default.png │ ├── Profiles │ │ ├── Application.config.xml │ │ └── Profile.config.xml │ ├── Smiles │ │ └── kolobok.jisp │ ├── Sounds │ │ ├── 1.wav │ │ ├── 2.wav │ │ └── 3.wav │ └── Themes │ │ └── Default │ │ ├── Brushes.xaml │ │ ├── General.xaml │ │ ├── OutputAreaStyles.xaml │ │ └── SettingsViewStyles.xaml ├── Helpers │ ├── ContextMenuServiceExtensions.cs │ ├── GlassEffectHelper.cs │ ├── ImageResizingUtility.cs │ ├── MemoryUtility.cs │ ├── StartupLinkUtil.cs │ ├── SystemHelper.cs │ └── UIHelper.cs ├── ImageUtils.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── MessageDecoration │ ├── ChatCommands.cs │ ├── Decorators │ │ ├── CommonMessageDecorator.cs │ │ ├── HyperlinkDecorator.cs │ │ ├── IMessageDecorator.cs │ │ ├── MessagePartType.cs │ │ ├── NickDecorator.cs │ │ ├── NickEventArgs.cs │ │ ├── RunEx.cs │ │ ├── SmilesDecorator.cs │ │ ├── TimestampDecorator.cs │ │ └── UrlEventArgs.cs │ ├── DecoratorsRegistry.cs │ ├── DecoratorsStyles.cs │ └── MessagePresenter.cs ├── Notifications │ ├── TaskbarNotifier.cs │ └── TrayController.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── DesignTimeResources.xaml │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Resources │ ├── DefaultBackground.jpg │ ├── EmptyIcon.ico │ ├── Moderator_icon.png │ ├── clean.ico │ ├── editicon.png │ ├── email.png │ ├── error.png │ ├── favorite.png │ ├── green-star-th.png │ ├── icon_crown.gif │ ├── icon_shutup.png │ ├── image.png │ ├── ligth-off.ico │ ├── ligth-on.ico │ ├── mail.png │ ├── medal_silver_2.png │ ├── noSound.png │ ├── note_delete.ico │ ├── remove.png │ ├── search-web.png │ ├── send.png │ ├── smile.gif │ ├── sound.png │ ├── stop.png │ ├── testavatar.png │ ├── tools.png │ ├── user group.ico │ ├── user1.png │ ├── user_man.png │ ├── users.png │ ├── users1.png │ ├── users_c.png │ ├── warning.png │ └── web search.png ├── Splashscreen.png ├── SynchronizeInvokeImpl.cs ├── ValueConverters │ ├── BraceConverter.cs │ ├── FalseToCollapsedValueConverter.cs │ ├── Invertor.cs │ ├── IsNullToCollapsedValueConverter.cs │ ├── RoleAndAffilationToImageConverter.cs │ ├── StatusTypeToIntegerConverter.cs │ ├── SubjectConverter.cs │ └── SumConverter.cs ├── View │ ├── ConferenceView.xaml │ ├── ConferenceView.xaml.cs │ ├── ConferencesList.xaml │ ├── ConferencesList.xaml.cs │ ├── ContextMenus.xaml │ ├── Dialogs │ │ ├── DialogManager.cs │ │ ├── InputDialog.xaml │ │ ├── InputDialog.xaml.cs │ │ ├── NickAndStatusDialog.xaml │ │ ├── NickAndStatusDialog.xaml.cs │ │ ├── VcardDialog.xaml │ │ └── VcardDialog.xaml.cs │ ├── LoginView.xaml │ ├── LoginView.xaml.cs │ ├── MainView.xaml │ ├── MainView.xaml.cs │ ├── Popups │ │ ├── ErrorNotification.xaml │ │ ├── ErrorNotification.xaml.cs │ │ ├── ErrorNotificationViewModel.cs │ │ ├── NotificationManager.cs │ │ ├── PrivateNotification.xaml │ │ ├── PrivateNotification.xaml.cs │ │ └── PrivateNotificationViewModel.cs │ ├── PrivateView.xaml │ ├── PrivateView.xaml.cs │ ├── SmilesView.xaml │ ├── SmilesView.xaml.cs │ └── ViewController.cs ├── ViewModel │ ├── ChatAreaViewModel.cs │ ├── ConferenceViewModel.Commands.cs │ ├── ConferenceViewModel.DesignTime.cs │ ├── ConferenceViewModel.cs │ ├── ConferencesListViewModel.cs │ ├── ConferencesServiceItem.cs │ ├── HyperlinkOperationsViewModel.cs │ ├── IChatAreaView.cs │ ├── IMainView.cs │ ├── LoginViewModel.cs │ ├── MainViewModel.Commands.cs │ ├── MainViewModel.cs │ ├── MessageViewModel.cs │ ├── NickAndStatusViewModel.cs │ ├── PrivateViewModel.cs │ ├── SettingsViewModel.cs │ ├── VcardViewModel.cs │ └── ViewModelBaseEx.cs └── app.config ├── Cyclops.TestFramework ├── Cyclops.TestFramework.csproj ├── MockPresences.cs ├── MockXmppClient.cs └── XUnitLoggerAdapter.cs ├── Cyclops.Tests ├── Cyclops.Tests.csproj ├── JidTests.cs ├── SharpXmppDataExtractorTests.cs ├── SharpXmppRoomTests.cs └── TimeIqTests.cs ├── Cyclops.Windows ├── Cyclops.Windows.csproj ├── LastInputDetector.cs └── User32.cs ├── Cyclops.Xmpp.SharpXmpp ├── Client │ ├── SharpXmppBookmarkManager.cs │ ├── SharpXmppClient.cs │ ├── SharpXmppConferenceManager.cs │ └── SharpXmppIqQueryManager.cs ├── Cyclops.Xmpp.SharpXmpp.csproj ├── Data │ ├── BookmarkedConferenceEx.cs │ ├── DiscoNode.cs │ ├── ExtendedUserDataEx.cs │ ├── Rooms │ │ ├── MucParticipant.cs │ │ └── SharpXmppRoom.cs │ └── SharpXmppDataExtractor.cs ├── Errors │ └── MessageOnlyException.cs ├── Protocol │ ├── ErrorEx.cs │ ├── IqEx.cs │ ├── JidEx.cs │ ├── MessageEx.cs │ ├── PresenceEx.cs │ ├── PresenceTypeEx.cs │ ├── PresenceTypes.cs │ └── XElementEx.cs └── Registration │ └── SharpXmppRegistrationManager.cs ├── Cyclops.Xmpp ├── Client │ ├── IBookmarkManager.cs │ ├── IConferenceManager.cs │ ├── IIqQueryManager.cs │ └── IXmppClient.cs ├── Cyclops.Xmpp.csproj ├── Data │ ├── CaptchaRequest.cs │ ├── ClientInfo.cs │ ├── IAdminItem.cs │ ├── IBookmark.cs │ ├── IExtendedUserData.cs │ ├── IXmppDataExtractor.cs │ ├── PhotoData.cs │ ├── PresenceDetails.cs │ ├── PresenceType.cs │ ├── Rooms │ │ ├── IMucParticipant.cs │ │ ├── IRoom.cs │ │ ├── IRoomItem.cs │ │ ├── MucAffiliation.cs │ │ ├── MucAffiliations.cs │ │ ├── MucRole.cs │ │ ├── MucRoles.cs │ │ └── MucUserStatus.cs │ ├── StatusType.cs │ └── VCard.cs ├── Protocol │ ├── Attributes.cs │ ├── Elements.cs │ ├── IDiscoNode.cs │ ├── IError.cs │ ├── IIq.cs │ ├── IMessage.cs │ ├── IPresence.cs │ ├── IStanza.cs │ ├── IqQueries │ │ ├── ILastIq.cs │ │ ├── ITimeIq.cs │ │ └── IVersionIq.cs │ ├── Jid.cs │ ├── MessageType.cs │ └── Namespaces.cs └── Registration │ ├── IRegistrationManager.cs │ └── RegistrationResult.cs ├── CyclopsChat.sln ├── CyclopsChat.sln.DotSettings ├── Directory.Build.props ├── Docs ├── screenshot-1.png └── screenshot-2.png ├── LICENSE.md ├── MAINTAINERSHIP.md ├── README.md ├── THIRD-PARTY-SOFTWARE.md ├── scripts └── verify-encoding.ps1 └── third-party ├── BusyIndicators └── LICENSE ├── CommonServiceLocator └── LICENSE.txt ├── Dirkster.NumericUpDownLib └── License.md ├── MvvmLightLibs └── LICENSE.txt ├── SharpXMPP └── LICENSE.md ├── Unity └── LICENSE └── dotnet ├── LICENSE.TXT ├── PATENTS.TXT └── THIRD-PARTY-NOTICES.TXT /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 4 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.yml] 11 | indent_size = 2 12 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # Code cleanup: fix UTF-8 BOM and line endings in all the files 2 | 1e91df3eaae39263f5fc7d91321b376202520acb 3 | 4 | # Code style: update namespaces in recently changed files 5 | dc125b41be5ddd79f3eabbb794a378b8c69dc544 6 | 7 | # Code cleanup: migrate to new-style namespace 8 | 92b7e9cb5159cdba7018869f2b59d98554c80de6 9 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 2 | version: 2 3 | updates: 4 | - package-ecosystem: "github-actions" 5 | directory: "/" 6 | schedule: 7 | interval: "daily" 8 | - package-ecosystem: "nuget" 9 | directory: "/" 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Main 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: 7 | branches: 8 | - master 9 | schedule: 10 | - cron: '0 0 * * 6' 11 | 12 | jobs: 13 | main: 14 | runs-on: windows-2019 15 | env: 16 | DOTNET_NOLOGO: 1 17 | DOTNET_CLI_TELEMETRY_OPTOUT: 1 18 | NUGET_PACKAGES: ${{ github.workspace }}/.github/nuget-packages 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | 23 | - name: NuGet cache 24 | uses: actions/cache@v4 25 | with: 26 | path: ${{ env.NUGET_PACKAGES }} 27 | key: ${{ runner.os }}.nuget.${{ hashFiles('**/*.csproj') }} 28 | - name: Set up .NET SDK 29 | uses: actions/setup-dotnet@v4 30 | with: 31 | dotnet-version: 6.0.x 32 | 33 | - name: Build 34 | run: dotnet build --configuration Release 35 | - name: Test 36 | run: dotnet test --configuration Release 37 | 38 | verify: 39 | runs-on: 'ubuntu-22.04' 40 | steps: 41 | - name: 'Checkout' 42 | uses: actions/checkout@v4 43 | - name: 'Verify encoding' 44 | shell: pwsh 45 | run: ./scripts/verify-encoding.ps1 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | 3 | bin/ 4 | obj/ 5 | 6 | *.user 7 | .vs/ 8 | -------------------------------------------------------------------------------- /.idea/.idea.CyclopsChat/.idea/dictionaries/fried.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jid 5 | storer 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/.idea.CyclopsChat/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 36 | -------------------------------------------------------------------------------- /.run/Cyclops.MainApplication.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 26 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributor Guide 2 | ================= 3 | 4 | Logging 5 | ------- 6 | To enable XMPP protocol logging, go to `app.config` (if building from sources) or `Cyclops.MainApplication.dll.config` (if working with a prebuilt version), and set `VerboseLogging`'s value to `true`. 7 | -------------------------------------------------------------------------------- /Cyclops.Configuration/ConnectionConfig.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace Cyclops.Configuration; 4 | 5 | /// 6 | /// Connection configuration 7 | /// 8 | public class ConnectionConfig 9 | { 10 | /// Server address. 11 | public string? Server { get; set; } 12 | 13 | /// Physical server address. 14 | public string? NetworkHost { get; set; } 15 | 16 | [Range(0, 65535)] public int Port { get; set; } = 5222; 17 | 18 | public string? User { get; set; } 19 | 20 | [Display(AutoGenerateField = false)] 21 | public string? EncodedPassword { get; set; } 22 | 23 | /* 24 | * TODO: Proxy 25 | */ 26 | 27 | public override string ToString() => 28 | $"Server: {Server}; NetworkHost: {NetworkHost}; User: {User}; Port: {Port}; Is password set: {!string.IsNullOrEmpty(EncodedPassword)}"; 29 | } 30 | -------------------------------------------------------------------------------- /Cyclops.Configuration/Cyclops.Configuration.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net6.0 4 | enable 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Cyclops.Console/Composition/Module.cs: -------------------------------------------------------------------------------- 1 | using Cyclops.Core; 2 | using Cyclops.Core.Modularity; 3 | using Unity; 4 | 5 | namespace Cyclops.Console.Composition 6 | { 7 | public sealed class Module : ModuleBase 8 | { 9 | public override void Initialize(IUnityContainer container) 10 | { 11 | container 12 | .RegisterType(); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Cyclops.Console/ConsoleWindow.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |