├── linux ├── .gitignore ├── .idea │ └── .idea.TweetDuck.Linux │ │ └── .idea │ │ ├── .name │ │ ├── codeStyles │ │ ├── inspectionProfiles │ │ ├── .gitignore │ │ ├── indexLayout.xml │ │ └── vcs.xml ├── global.json ├── TweetImpl.CefGlue │ ├── Lib.cs │ ├── Utils │ │ ├── CefActionTask.cs │ │ └── GtkUtils.cs │ ├── Adapters │ │ ├── CefAdapter.cs │ │ ├── CefErrorCodeAdapter.cs │ │ ├── CefJsDialogCallbackAdapter.cs │ │ ├── CefDragDataAdapter.cs │ │ ├── CefResourceHandlerFactory.cs │ │ ├── CefFileDialogCallbackAdapter.cs │ │ ├── CefFrameAdapter.cs │ │ ├── CefResponseAdapter.cs │ │ └── CefMenuModelAdapter.cs │ ├── Handlers │ │ ├── DragHandler.cs │ │ ├── ResponseFilter.cs │ │ ├── ResourceRequestHandlerFactory.cs │ │ └── DialogHandler.cs │ ├── Component │ │ └── CustomWebClient.cs │ ├── TweetImpl.CefGlue.csproj │ ├── Resources │ │ └── bridge.skeleton.js │ └── Dialogs │ │ └── FileDialogOpener.cs ├── Directory.Build.props ├── TweetDuck │ ├── Configuration │ │ └── SystemConfiguration.cs │ ├── Resources │ │ └── build.sh │ ├── Browser │ │ └── Base │ │ │ ├── PopupHandler.cs │ │ │ ├── CefBrowserComponent.cs │ │ │ └── ContextMenuBrowser.cs │ ├── Utils │ │ └── WindowManager.cs │ └── Application │ │ ├── MessageDialogs.cs │ │ ├── SystemHandler.cs │ │ └── FileDialogs.cs └── publish.sh ├── .github └── FUNDING.yml ├── bld ├── Redist │ ├── msvcp140.dll │ ├── ucrtbase.dll │ ├── concrt140.dll │ ├── msvcp140_1.dll │ ├── msvcp140_2.dll │ ├── vccorlib140.dll │ ├── vcruntime140.dll │ ├── msvcp140_atomic_wait.dll │ ├── msvcp140_codecvt_ids.dll │ ├── api-ms-win-core-debug-l1-1-0.dll │ ├── api-ms-win-core-file-l1-1-0.dll │ ├── api-ms-win-core-file-l1-2-0.dll │ ├── api-ms-win-core-file-l2-1-0.dll │ ├── api-ms-win-core-heap-l1-1-0.dll │ ├── api-ms-win-core-synch-l1-1-0.dll │ ├── api-ms-win-core-synch-l1-2-0.dll │ ├── api-ms-win-core-util-l1-1-0.dll │ ├── api-ms-win-crt-conio-l1-1-0.dll │ ├── api-ms-win-crt-heap-l1-1-0.dll │ ├── api-ms-win-crt-locale-l1-1-0.dll │ ├── api-ms-win-crt-math-l1-1-0.dll │ ├── api-ms-win-crt-stdio-l1-1-0.dll │ ├── api-ms-win-crt-string-l1-1-0.dll │ ├── api-ms-win-crt-time-l1-1-0.dll │ ├── API-MS-Win-core-xstate-l2-1-0.dll │ ├── api-ms-win-core-console-l1-1-0.dll │ ├── api-ms-win-core-console-l1-2-0.dll │ ├── api-ms-win-core-fibers-l1-1-0.dll │ ├── api-ms-win-core-handle-l1-1-0.dll │ ├── api-ms-win-core-memory-l1-1-0.dll │ ├── api-ms-win-core-profile-l1-1-0.dll │ ├── api-ms-win-core-string-l1-1-0.dll │ ├── api-ms-win-core-sysinfo-l1-1-0.dll │ ├── api-ms-win-crt-convert-l1-1-0.dll │ ├── api-ms-win-crt-private-l1-1-0.dll │ ├── api-ms-win-crt-process-l1-1-0.dll │ ├── api-ms-win-crt-runtime-l1-1-0.dll │ ├── api-ms-win-crt-utility-l1-1-0.dll │ ├── api-ms-win-core-datetime-l1-1-0.dll │ ├── api-ms-win-core-namedpipe-l1-1-0.dll │ ├── api-ms-win-core-rtlsupport-l1-1-0.dll │ ├── api-ms-win-core-timezone-l1-1-0.dll │ ├── api-ms-win-crt-environment-l1-1-0.dll │ ├── api-ms-win-crt-filesystem-l1-1-0.dll │ ├── api-ms-win-crt-multibyte-l1-1-0.dll │ ├── api-ms-win-core-interlocked-l1-1-0.dll │ ├── api-ms-win-core-localization-l1-2-0.dll │ ├── api-ms-win-core-errorhandling-l1-1-0.dll │ ├── api-ms-win-core-libraryloader-l1-1-0.dll │ ├── api-ms-win-core-processthreads-l1-1-0.dll │ ├── api-ms-win-core-processthreads-l1-1-1.dll │ └── api-ms-win-core-processenvironment-l1-1-0.dll ├── Resources │ ├── icon.ico │ └── devtools_resources.pak └── GEN INSTALLERS.bat ├── resources ├── Guide │ ├── img │ │ ├── icon.ico │ │ ├── app-menu.png │ │ ├── new-tweet-pin.png │ │ ├── options-manage.png │ │ ├── options-sounds.png │ │ ├── new-tweet-emoji.png │ │ ├── column-clear-header.png │ │ ├── column-preferences.png │ │ ├── settings-dropdown.png │ │ ├── settings-editdesign.png │ │ ├── options-manage-export.png │ │ ├── options-manage-reset.png │ │ ├── column-clear-preferences.png │ │ ├── new-tweet-template-basic.png │ │ ├── options-notifications-size.png │ │ ├── new-tweet-template-advanced.png │ │ └── options-notifications-location.png │ └── script.js ├── Content │ ├── login │ │ ├── login.css │ │ ├── setup_document_attributes.js │ │ ├── redirect_plain_twitter_com.js │ │ └── hide_cookie_bar.js │ ├── images │ │ ├── logo.png │ │ └── spinner.apng │ ├── notification │ │ ├── disable_clipboard_formatting.js │ │ ├── expand_links_or_show_tooltip.js │ │ ├── reset_scroll_position_on_load.js │ │ ├── handle_show_this_thread_link.js │ │ ├── setup_body_hover_class.js │ │ ├── add_skip_button.js │ │ ├── scroll_smoothly.js │ │ ├── screenshot │ │ │ └── screenshot.js │ │ └── handle_links.js │ ├── tweetdeck │ │ ├── disable_clipboard_formatting.js │ │ ├── disable_tweetdeck_preview.js │ │ ├── ready_plugins.js │ │ ├── globals │ │ │ ├── reload_browser.js │ │ │ ├── reload_columns.js │ │ │ ├── get_class_style_property.js │ │ │ ├── prioritize_newest_event.js │ │ │ ├── get_hovered_column.js │ │ │ ├── apply_rot13.js │ │ │ ├── get_column_name.js │ │ │ ├── retrieve_tweet.js │ │ │ └── get_hovered_tweet.js │ │ ├── tweetdeck_preview_warning.js │ │ ├── fix_os_name.js │ │ ├── register_global_functions_jquery.js │ │ ├── focus_composer_after_image_upload.js │ │ ├── inject_css.js │ │ ├── skip_pre_login_page.js │ │ ├── configure_language_for_translations.js │ │ ├── move_accounts_above_hashtags_in_search.js │ │ ├── register_composer_active_event.js │ │ ├── focus_composer_after_switching_account.js │ │ ├── fix_dm_input_box_focus.js │ │ ├── disable_td_metrics.js │ │ ├── setup_column_type_attributes.js │ │ ├── limit_loaded_dm_count.js │ │ ├── fix_youtube_previews.js │ │ ├── fix_missing_bing_translator_languages.js │ │ ├── fix_scheduled_tweets_not_appearing.js │ │ ├── register_global_functions.js │ │ ├── fix_marking_dm_as_read_when_replying.js │ │ ├── fix_horizontal_scrolling_of_column_container.js │ │ ├── focus_composer_after_alt_tab.js │ │ ├── configure_first_day_of_week.js │ │ ├── clear_search_input.js │ │ ├── fix_media_preview_urls.js │ │ └── make_retweets_lowercase.js │ ├── plugins │ │ ├── setup.js │ │ └── notification │ │ │ └── plugins.js │ ├── api │ │ ├── ready.js │ │ └── utils.js │ └── bootstrap.js ├── Plugins │ ├── .debug │ │ ├── notification.js │ │ └── .meta │ ├── templates │ │ └── .meta │ ├── timeline-polls │ │ └── .meta │ ├── edit-design │ │ └── .meta │ ├── emoji-keyboard │ │ └── .meta │ ├── clear-columns │ │ └── .meta │ └── reply-account │ │ └── .meta ├── Design │ ├── icon_pushpin.afdesign │ ├── video_buttons.afdesign │ ├── app_logos_large.afdesign │ └── app_logos_small.afdesign └── ..code-workspace ├── .gitattributes ├── windows ├── TweetDuck.Video │ ├── Resources │ │ ├── icon.ico │ │ ├── btnClose.png │ │ ├── btnResize.png │ │ └── btnDownload.png │ ├── Controls │ │ └── ControlWMP.cs │ └── Properties │ │ └── AssemblyInfo.cs ├── TweetDuck │ ├── Resources │ │ ├── Images │ │ │ ├── icon.ico │ │ │ ├── icon-tray.ico │ │ │ ├── icon-muted.ico │ │ │ ├── icon-small.ico │ │ │ ├── icon-tray-new.ico │ │ │ └── icon-tray-muted.ico │ │ └── Utilities │ │ │ └── CompareStylesheets.cs │ ├── Browser │ │ ├── Notification │ │ │ ├── NotificationPauseReason.cs │ │ │ └── Screenshot │ │ │ │ └── ScreenshotBridge.cs │ │ ├── Base │ │ │ ├── PopupHandler.cs │ │ │ ├── CefBrowserComponent.cs │ │ │ └── BrowserProcessHandler.cs │ │ └── TrayIcon.Designer.cs │ ├── Controls │ │ ├── FlatButton.cs │ │ ├── FlowLayoutPanelNoHScroll.cs │ │ ├── NumericUpDownEx.cs │ │ ├── LabelVertical.cs │ │ └── FlatProgressBar.cs │ ├── app.config │ ├── Application │ │ ├── MessageDialogs.cs │ │ └── FileDialogs.cs │ ├── Dialogs │ │ └── Settings │ │ │ ├── TabSettingsFeedback.cs │ │ │ └── DialogSettingsSearchEngine.cs │ ├── Updates │ │ └── FormUpdateDownload.cs │ └── Management │ │ └── WindowsSessionManager.cs ├── TweetLib.WinForms.Legacy │ ├── Windows │ │ └── Forms │ │ │ ├── LegacyWinForms.cs │ │ │ └── Command2.cs │ └── TweetLib.WinForms.Legacy.csproj ├── TweetImpl.CefSharp │ ├── Adapters │ │ ├── CefAdapter.cs │ │ ├── CefErrorCodeAdapter.cs │ │ ├── CefDragDataAdapter.cs │ │ ├── CefJsDialogCallbackAdapter.cs │ │ ├── CefFrameAdapter.cs │ │ ├── CefFileDialogCallbackAdapter.cs │ │ ├── CefBrowserAdapter.cs │ │ └── CefResponseAdapter.cs │ ├── Handlers │ │ ├── CefResourceHandlerFactory.cs │ │ ├── CefDragHandler.cs │ │ ├── CefResponseFilter.cs │ │ ├── CefDownloadRequestClient.cs │ │ ├── CefSchemeHandlerFactory.cs │ │ └── CefFileDialogHandler.cs │ ├── Dialogs │ │ └── FileDialogOpener.cs │ └── Properties │ │ └── AssemblyInfo.cs └── TweetDuck.Browser │ ├── Program.cs │ └── Properties │ └── AssemblyInfo.cs ├── global.json ├── lib ├── TweetLib.Core │ ├── Features │ │ ├── Twitter │ │ │ ├── ImageQuality.cs │ │ │ ├── JQuery.cs │ │ │ └── TweetDeckTranslations.cs │ │ ├── Plugins │ │ │ ├── Enums │ │ │ │ ├── PluginFolder.cs │ │ │ │ └── PluginGroup.cs │ │ │ └── Events │ │ │ │ ├── PluginChangedStateEventArgs.cs │ │ │ │ └── PluginErrorEventArgs.cs │ │ ├── TweetDeck │ │ │ ├── ISoundNotificationHandler.cs │ │ │ ├── ITweetDeckInterface.cs │ │ │ ├── VendorScriptProcessor.cs │ │ │ └── TweetDeckExtraContext.cs │ │ ├── Notifications │ │ │ ├── INotificationInterface.cs │ │ │ ├── NotificationBridgeObject.cs │ │ │ ├── NotificationBrowser.Example.cs │ │ │ ├── NotificationBrowser.cs │ │ │ └── NotificationBrowser.Screenshot.cs │ │ ├── ICommonInterface.cs │ │ └── BaseBrowser.cs │ ├── Systems │ │ ├── Configuration │ │ │ ├── IConfigInstance.cs │ │ │ ├── IConfigObject.cs │ │ │ ├── ConfigObjects.cs │ │ │ └── BaseConfig.cs │ │ └── Updates │ │ │ ├── IUpdateCheckClient.cs │ │ │ ├── UpdateCheckEventArgs.cs │ │ │ └── UpdateDownloadStatus.cs │ ├── Application │ │ ├── IAppSystemConfiguration.cs │ │ ├── IAppMessageDialogs.cs │ │ ├── IAppErrorHandler.cs │ │ ├── IAppFileDialogs.cs │ │ ├── AppException.cs │ │ ├── IAppSetup.cs │ │ ├── IAppSystemHandler.cs │ │ └── IAppUserConfiguration.cs │ ├── Lib.cs │ └── TweetLib.Core.csproj ├── TweetLib.Browser.CEF │ ├── Dialogs │ │ ├── FileDialogType.cs │ │ ├── JsDialogType.cs │ │ └── MessageDialogType.cs │ ├── Interfaces │ │ ├── ICefAdapter.cs │ │ ├── IErrorCodeAdapter.cs │ │ ├── IPopupHandler.cs │ │ ├── IJsDialogCallbackAdapter.cs │ │ ├── IDragDataAdapter.cs │ │ ├── IFileDialogCallbackAdapter.cs │ │ ├── IResourceHandlerFactory.cs │ │ ├── IFrameAdapter.cs │ │ ├── IFileDialogOpener.cs │ │ ├── IResponseAdapter.cs │ │ ├── IBrowserWrapper.cs │ │ ├── IJsDialogOpener.cs │ │ ├── IMenuModelAdapter.cs │ │ └── IRequestAdapter.cs │ ├── Lib.cs │ ├── Data │ │ ├── ContextMenuActionRegistry.cs │ │ ├── DownloadCallbacks.cs │ │ └── ByteArrayResource.cs │ ├── TweetLib.Browser.CEF.csproj │ ├── Logic │ │ ├── LifeSpanHandlerLogic.cs │ │ ├── SchemeHandlerFactoryLogic.cs │ │ └── ResourceRequestHandlerFactoryLogic.cs │ └── Utils │ │ ├── SpellCheck.cs │ │ └── CefUtils.cs ├── TweetLib.Browser │ ├── Interfaces │ │ ├── IResponseProcessor.cs │ │ ├── IContextMenuHandler.cs │ │ ├── IResourceRequestHandler.cs │ │ ├── ISchemeResourceVisitor.cs │ │ ├── ICustomSchemeHandler.cs │ │ ├── IContextMenuBuilder.cs │ │ ├── ResponseProcessorUtf8.cs │ │ └── IBrowserComponent.cs │ ├── Request │ │ ├── ResourceType.cs │ │ ├── RequestHandleResult.cs │ │ ├── SchemeResource.cs │ │ └── ResourceCache.cs │ ├── Lib.cs │ ├── Events │ │ ├── BrowserLoadedEventArgs.cs │ │ └── PageLoadEventArgs.cs │ ├── Base │ │ ├── BrowserSetup.cs │ │ └── BaseBrowser.cs │ ├── Contexts │ │ ├── Link.cs │ │ ├── Selection.cs │ │ ├── Notification.cs │ │ ├── Context.cs │ │ ├── Media.cs │ │ └── Tweet.cs │ └── TweetLib.Browser.csproj ├── TweetLib.Utils │ ├── Lib.cs │ ├── Data │ │ ├── WindowState.cs │ │ └── InjectedString.cs │ ├── Serialization │ │ ├── ITypeConverter.cs │ │ ├── SerializationSoftException.cs │ │ ├── TypeConverterRegistry.cs │ │ └── Converters │ │ │ └── BasicTypeConverter.cs │ ├── Dialogs │ │ ├── SaveFileDialogSettings.cs │ │ └── FileDialogFilter.cs │ ├── TweetLib.Utils.csproj │ └── Startup │ │ ├── UnlockResult.cs │ │ └── LockResult.cs ├── TweetLib.Communication │ ├── Lib.cs │ └── TweetLib.Communication.csproj ├── TweetTest.Core │ └── TweetTest.Core.fsproj └── TweetTest.Browser.CEF │ └── TweetTest.Browser.CEF.fsproj ├── .idea └── .idea.TweetDuck │ └── .idea │ ├── codeStyles │ └── codeStyleConfig.xml │ ├── .gitignore │ ├── jsLibraryMappings.xml │ ├── encodings.xml │ ├── inspectionProfiles │ └── profiles_settings.xml │ ├── indexLayout.xml │ ├── vcs.xml │ └── runConfigurations │ └── TweetDuck.xml ├── Version.cs └── LICENSE.md /linux/.gitignore: -------------------------------------------------------------------------------- 1 | bld/ 2 | lib/ 3 | -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/.name: -------------------------------------------------------------------------------- 1 | TweetDuck.Linux -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: chylex 2 | patreon: chylex 3 | ko_fi: chylex 4 | -------------------------------------------------------------------------------- /bld/Redist/msvcp140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/msvcp140.dll -------------------------------------------------------------------------------- /bld/Redist/ucrtbase.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/ucrtbase.dll -------------------------------------------------------------------------------- /bld/Resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Resources/icon.ico -------------------------------------------------------------------------------- /bld/Redist/concrt140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/concrt140.dll -------------------------------------------------------------------------------- /bld/Redist/msvcp140_1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/msvcp140_1.dll -------------------------------------------------------------------------------- /bld/Redist/msvcp140_2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/msvcp140_2.dll -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/codeStyles: -------------------------------------------------------------------------------- 1 | ../../../../.idea/.idea.TweetDuck/.idea/codeStyles -------------------------------------------------------------------------------- /bld/Redist/vccorlib140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/vccorlib140.dll -------------------------------------------------------------------------------- /bld/Redist/vcruntime140.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/vcruntime140.dll -------------------------------------------------------------------------------- /resources/Guide/img/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/icon.ico -------------------------------------------------------------------------------- /resources/Content/login/login.css: -------------------------------------------------------------------------------- 1 | html[login] *, html[logout] * { 2 | border-radius: 0 !important; 3 | } 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto eof=lf 3 | *.cs diff=csharp 4 | -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/inspectionProfiles: -------------------------------------------------------------------------------- 1 | ../../../../.idea/.idea.TweetDuck/.idea/inspectionProfiles -------------------------------------------------------------------------------- /resources/Content/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Content/images/logo.png -------------------------------------------------------------------------------- /resources/Guide/img/app-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/app-menu.png -------------------------------------------------------------------------------- /resources/Plugins/.debug/notification.js: -------------------------------------------------------------------------------- 1 | run(){ 2 | console.info("executed debug plugin in notification"); 3 | } 4 | -------------------------------------------------------------------------------- /bld/Redist/msvcp140_atomic_wait.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/msvcp140_atomic_wait.dll -------------------------------------------------------------------------------- /bld/Redist/msvcp140_codecvt_ids.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/msvcp140_codecvt_ids.dll -------------------------------------------------------------------------------- /bld/Resources/devtools_resources.pak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Resources/devtools_resources.pak -------------------------------------------------------------------------------- /resources/Content/images/spinner.apng: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Content/images/spinner.apng -------------------------------------------------------------------------------- /resources/Design/icon_pushpin.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Design/icon_pushpin.afdesign -------------------------------------------------------------------------------- /resources/Guide/img/new-tweet-pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/new-tweet-pin.png -------------------------------------------------------------------------------- /resources/Guide/img/options-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-manage.png -------------------------------------------------------------------------------- /resources/Guide/img/options-sounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-sounds.png -------------------------------------------------------------------------------- /resources/Design/video_buttons.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Design/video_buttons.afdesign -------------------------------------------------------------------------------- /resources/Guide/img/new-tweet-emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/new-tweet-emoji.png -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-debug-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-debug-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-file-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-file-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-file-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-file-l1-2-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-file-l2-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-file-l2-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-heap-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-heap-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-synch-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-synch-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-synch-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-synch-l1-2-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-util-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-util-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-conio-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-conio-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-heap-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-heap-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-locale-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-locale-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-math-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-math-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-stdio-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-stdio-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-string-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-string-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-time-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-time-l1-1-0.dll -------------------------------------------------------------------------------- /resources/Design/app_logos_large.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Design/app_logos_large.afdesign -------------------------------------------------------------------------------- /resources/Design/app_logos_small.afdesign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Design/app_logos_small.afdesign -------------------------------------------------------------------------------- /resources/Guide/img/column-clear-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/column-clear-header.png -------------------------------------------------------------------------------- /resources/Guide/img/column-preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/column-preferences.png -------------------------------------------------------------------------------- /resources/Guide/img/settings-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/settings-dropdown.png -------------------------------------------------------------------------------- /resources/Guide/img/settings-editdesign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/settings-editdesign.png -------------------------------------------------------------------------------- /windows/TweetDuck.Video/Resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck.Video/Resources/icon.ico -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon.ico -------------------------------------------------------------------------------- /bld/Redist/API-MS-Win-core-xstate-l2-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/API-MS-Win-core-xstate-l2-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-console-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-console-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-console-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-console-l1-2-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-fibers-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-fibers-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-handle-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-handle-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-memory-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-memory-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-profile-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-profile-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-string-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-string-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-sysinfo-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-sysinfo-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-convert-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-convert-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-private-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-private-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-process-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-process-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-runtime-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-runtime-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-utility-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-utility-l1-1-0.dll -------------------------------------------------------------------------------- /resources/Guide/img/options-manage-export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-manage-export.png -------------------------------------------------------------------------------- /resources/Guide/img/options-manage-reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-manage-reset.png -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-datetime-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-datetime-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-namedpipe-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-namedpipe-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-rtlsupport-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-rtlsupport-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-timezone-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-timezone-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-environment-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-environment-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-filesystem-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-filesystem-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-crt-multibyte-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-crt-multibyte-l1-1-0.dll -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "7.0.0", 4 | "rollForward": "latestMinor", 5 | "allowPrerelease": false 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /resources/Guide/img/column-clear-preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/column-clear-preferences.png -------------------------------------------------------------------------------- /resources/Guide/img/new-tweet-template-basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/new-tweet-template-basic.png -------------------------------------------------------------------------------- /windows/TweetDuck.Video/Resources/btnClose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck.Video/Resources/btnClose.png -------------------------------------------------------------------------------- /windows/TweetDuck.Video/Resources/btnResize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck.Video/Resources/btnResize.png -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon-tray.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon-tray.ico -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-interlocked-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-interlocked-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-localization-l1-2-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-localization-l1-2-0.dll -------------------------------------------------------------------------------- /linux/global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "7.0.0", 4 | "rollForward": "latestMinor", 5 | "allowPrerelease": false 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /resources/Guide/img/options-notifications-size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-notifications-size.png -------------------------------------------------------------------------------- /windows/TweetDuck.Video/Resources/btnDownload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck.Video/Resources/btnDownload.png -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon-muted.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon-muted.ico -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon-small.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon-small.ico -------------------------------------------------------------------------------- /bld/GEN INSTALLERS.bat: -------------------------------------------------------------------------------- 1 | start "" /B "ISCC.exe" /Q "gen_full.iss" 2 | start "" /B "ISCC.exe" /Q "gen_port.iss" 3 | start "" /B "ISCC.exe" /Q "gen_upd.iss" 4 | -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-errorhandling-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-errorhandling-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-libraryloader-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-libraryloader-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-processthreads-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-processthreads-l1-1-0.dll -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-processthreads-l1-1-1.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-processthreads-l1-1-1.dll -------------------------------------------------------------------------------- /resources/Guide/img/new-tweet-template-advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/new-tweet-template-advanced.png -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon-tray-new.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon-tray-new.ico -------------------------------------------------------------------------------- /resources/Guide/img/options-notifications-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/resources/Guide/img/options-notifications-location.png -------------------------------------------------------------------------------- /windows/TweetDuck/Resources/Images/icon-tray-muted.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/windows/TweetDuck/Resources/Images/icon-tray-muted.ico -------------------------------------------------------------------------------- /bld/Redist/api-ms-win-core-processenvironment-l1-1-0.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chylex/TweetDuck/HEAD/bld/Redist/api-ms-win-core-processenvironment-l1-1-0.dll -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Twitter/ImageQuality.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Features.Twitter { 2 | public enum ImageQuality { 3 | Default, 4 | Best 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Plugins/Enums/PluginFolder.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Features.Plugins.Enums { 2 | public enum PluginFolder { 3 | Root, 4 | Data 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Dialogs/FileDialogType.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Dialogs { 2 | public enum FileDialogType { 3 | Open, 4 | OpenMultiple, 5 | Other 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/IResponseProcessor.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Interfaces { 2 | public interface IResponseProcessor { 3 | byte[] Process(byte[] response); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Dialogs/JsDialogType.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Dialogs { 2 | public enum JsDialogType { 3 | Alert, 4 | Confirm, 5 | Prompt, 6 | Unknown 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Configuration/IConfigInstance.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Systems.Configuration { 2 | public interface IConfigInstance { 3 | void Save(); 4 | void Reset(); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/ICefAdapter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Browser.CEF.Interfaces { 4 | public interface ICefAdapter { 5 | void RunOnUiThread(Action action); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppSystemConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Application { 2 | public interface IAppSystemConfiguration { 3 | bool UseSystemProxyForAllConnections { get; } 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /resources/Plugins/templates/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Tweet templates 3 | 4 | [description] 5 | Adds a [Manage templates] button to the New Tweet panel. 6 | 7 | [author] 8 | chylex 9 | 10 | [requires] 11 | {version} -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /projectSettingsUpdater.xml 6 | /modules.xml 7 | /contentModel.xml 8 | /.idea.TweetDuck.iml 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Request/ResourceType.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Request { 2 | public enum ResourceType { 3 | Unknown, 4 | MainFrame, 5 | Script, 6 | Stylesheet, 7 | Xhr, 8 | Image 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Dialogs/MessageDialogType.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Dialogs { 2 | public enum MessageDialogType { 3 | None, 4 | Question, 5 | Information, 6 | Warning, 7 | Error 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IErrorCodeAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IErrorCodeAdapter { 3 | bool IsAborted(T errorCode); 4 | string? GetName(T errorCode); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /resources/Plugins/timeline-polls/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Show poll results 3 | 4 | [description] 5 | Displays poll results directly in timelines and notifications. 6 | 7 | [author] 8 | chylex 9 | 10 | [requires] 11 | {version} -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IPopupHandler.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IPopupHandler { 3 | bool IsPopupAllowed(string url); 4 | void OpenExternalBrowser(string url); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Lib.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("TweetDuck Browser Library")] 4 | [assembly: AssemblyDescription("TweetDuck Browser Library")] 5 | [assembly: AssemblyProduct("TweetLib.Browser")] 6 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Lib.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("TweetDuck Utilities Library")] 4 | [assembly: AssemblyDescription("TweetDuck Utilities Library")] 5 | [assembly: AssemblyProduct("TweetLib.Utils")] 6 | -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Rider ignored files 5 | /projectSettingsUpdater.xml 6 | /modules.xml 7 | /contentModel.xml 8 | /.idea.TweetDuck.Linux.iml 9 | -------------------------------------------------------------------------------- /resources/Content/notification/disable_clipboard_formatting.js: -------------------------------------------------------------------------------- 1 | import disable_clipboard_formatting from "../tweetdeck/disable_clipboard_formatting.js"; 2 | 3 | export default function() { 4 | disable_clipboard_formatting(); 5 | }; 6 | -------------------------------------------------------------------------------- /resources/Content/notification/expand_links_or_show_tooltip.js: -------------------------------------------------------------------------------- 1 | import expand_links_or_show_tooltip from "../tweetdeck/expand_links_or_show_tooltip.js"; 2 | 3 | export default function() { 4 | expand_links_or_show_tooltip(); 5 | }; 6 | -------------------------------------------------------------------------------- /resources/Content/notification/reset_scroll_position_on_load.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Forces the scroll position to reset every time a notification loads. 3 | */ 4 | export default function() { 5 | history.scrollRestoration = "manual"; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Data/WindowState.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | 3 | namespace TweetLib.Utils.Data { 4 | public sealed class WindowState { 5 | public Rectangle Bounds { get; set; } 6 | public bool IsMaximized { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Lib.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("TweetDuck Browser CEF Library")] 4 | [assembly: AssemblyDescription("TweetDuck Browser CEF Library")] 5 | [assembly: AssemblyProduct("TweetLib.Browser.CEF")] 6 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppMessageDialogs.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Application { 2 | public interface IAppMessageDialogs { 3 | void Information(string caption, string text); 4 | void Error(string caption, string text); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/IContextMenuHandler.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Contexts; 2 | 3 | namespace TweetLib.Browser.Interfaces { 4 | public interface IContextMenuHandler { 5 | void Show(IContextMenuBuilder menu, Context context); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppErrorHandler.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Core.Application { 4 | public interface IAppErrorHandler { 5 | void HandleException(string caption, string message, bool canIgnore, Exception e); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/TweetDeck/ISoundNotificationHandler.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Features.TweetDeck { 2 | public interface ISoundNotificationHandler { 3 | void Unregister(string url); 4 | void Register(string url, string path); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Updates/IUpdateCheckClient.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace TweetLib.Core.Systems.Updates { 4 | public interface IUpdateCheckClient { 5 | bool CanCheck { get; } 6 | Task Check(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Lib.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("TweetDuck CefGlue Implementation")] 4 | [assembly: AssemblyDescription("TweetDuck CefGlue Implementation")] 5 | [assembly: AssemblyProduct("TweetImpl.CefGlue")] 6 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Events/BrowserLoadedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Browser.Events { 4 | public abstract class BrowserLoadedEventArgs : EventArgs { 5 | public abstract void AddDictionaryWords(params string[] word); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Communication/Lib.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | 3 | [assembly: AssemblyTitle("TweetDuck Communication Library")] 4 | [assembly: AssemblyDescription("TweetDuck Communication Library")] 5 | [assembly: AssemblyProduct("TweetLib.Communication")] 6 | -------------------------------------------------------------------------------- /resources/Plugins/edit-design/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Edit layout & design 3 | 4 | [description] 5 | Expand the [Settings] menu and open [Edit layout & design] to customize how TweetDeck looks. 6 | 7 | [author] 8 | chylex 9 | 10 | [requires] 11 | {version} -------------------------------------------------------------------------------- /windows/TweetLib.WinForms.Legacy/Windows/Forms/LegacyWinForms.cs: -------------------------------------------------------------------------------- 1 | namespace System.Windows.Forms; 2 | 3 | public static class LegacyWinForms { 4 | public static void EnsureValid() { 5 | Command2.EnsureValid(); 6 | ContextMenu.EnsureValid(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/IResourceRequestHandler.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Request; 2 | 3 | namespace TweetLib.Browser.Interfaces { 4 | public interface IResourceRequestHandler { 5 | RequestHandleResult? Handle(string url, ResourceType resourceType); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IJsDialogCallbackAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IJsDialogCallbackAdapter { 3 | void Continue(T callback, bool success, string? userInput = null); 4 | void Dispose(T callback); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppFileDialogs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Utils.Dialogs; 3 | 4 | namespace TweetLib.Core.Application { 5 | public interface IAppFileDialogs { 6 | void SaveFile(SaveFileDialogSettings settings, Action onAccepted); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Configuration/IConfigObject.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Systems.Configuration { 2 | public interface IConfigObject {} 3 | 4 | public interface IConfigObject : IConfigObject where T : IConfigObject { 5 | T ConstructWithDefaults(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/indexLayout.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Version.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using TweetDuck; 3 | 4 | [assembly: AssemblyVersion(Version.Tag)] 5 | [assembly: AssemblyFileVersion(Version.Tag)] 6 | 7 | namespace TweetDuck { 8 | internal static class Version { 9 | public const string Tag = "1.26"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/ISchemeResourceVisitor.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Request; 2 | 3 | namespace TweetLib.Browser.Interfaces { 4 | public interface ISchemeResourceVisitor { 5 | T Status(SchemeResource.Status status); 6 | T File(SchemeResource.File file); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /resources/Plugins/emoji-keyboard/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Emoji picker 3 | 4 | [description] 5 | Adds a button that opens an emoji picker in the New Tweet panel. 6 | Use :short_codes: to quickly add emoji when writing tweets. 7 | 8 | [author] 9 | chylex 10 | 11 | [requires] 12 | {version} -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/ICustomSchemeHandler.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.Request; 3 | 4 | namespace TweetLib.Browser.Interfaces { 5 | public interface ICustomSchemeHandler { 6 | string Protocol { get; } 7 | SchemeResource? Resolve(Uri uri); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/TweetDeck/ITweetDeckInterface.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Features.TweetDeck { 2 | public interface ITweetDeckInterface : ICommonInterface { 3 | void OnIntroductionClosed(bool showGuide); 4 | void OpenContextMenu(); 5 | void OpenProfileImport(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IDragDataAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IDragDataAdapter { 3 | bool IsLink(T data); 4 | string GetLink(T data); 5 | 6 | bool IsFragment(T data); 7 | string GetFragmentAsText(T data); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Events/PageLoadEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Browser.Events { 4 | public sealed class PageLoadEventArgs : EventArgs { 5 | public string Url { get; } 6 | 7 | public PageLoadEventArgs(string url) { 8 | Url = url; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /windows/TweetDuck/Browser/Notification/NotificationPauseReason.cs: -------------------------------------------------------------------------------- 1 | namespace TweetDuck.Browser.Notification { 2 | enum NotificationPauseReason { 3 | UserConfiguration, 4 | SettingsDialogOpen, 5 | WindowsSessionLocked, 6 | SystemIdle, 7 | CursorOverNotificationArea 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Base/BrowserSetup.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Interfaces; 2 | 3 | namespace TweetLib.Browser.Base { 4 | public sealed class BrowserSetup { 5 | public IContextMenuHandler? ContextMenuHandler { get; set; } 6 | public IResourceRequestHandler? ResourceRequestHandler { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Contexts/Link.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Contexts { 2 | public readonly struct Link { 3 | public string Url { get; } 4 | public string CopyUrl { get; } 5 | 6 | public Link(string url, string copyUrl) { 7 | Url = url; 8 | CopyUrl = copyUrl; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Serialization/ITypeConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Utils.Serialization { 4 | public interface ITypeConverter { 5 | bool TryWriteType(Type type, object? value, out string? converted); 6 | bool TryReadType(Type type, string value, out object? converted); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IFileDialogCallbackAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IFileDialogCallbackAdapter { 3 | void Continue(T callback, int selectedAcceptFilter, string[] filePaths); 4 | void Cancel(T callback); 5 | void Dispose(T callback); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IResourceHandlerFactory.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.CEF.Data; 2 | 3 | namespace TweetLib.Browser.CEF.Interfaces { 4 | public interface IResourceHandlerFactory { 5 | T CreateResourceHandler(ByteArrayResource resource); 6 | string GetMimeTypeFromExtension(string extension); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Contexts/Selection.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Contexts { 2 | public readonly struct Selection { 3 | public string Text { get; } 4 | public bool Editable { get; } 5 | 6 | public Selection(string text, bool editable) { 7 | Text = text; 8 | Editable = editable; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /resources/Plugins/.debug/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Debug plugin 3 | 4 | [description] 5 | Enables debug functionality and tests. 6 | Text line 2. 7 | Text line 3. 8 | Text line 4. 9 | Text line 5. 10 | Text line 6. 11 | 12 | [author] 13 | chylex 14 | 15 | [version] 16 | 1.2 17 | 18 | [website] 19 | https://tweetduck.chylex.com -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/AppException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Core.Application { 4 | public sealed class AppException : Exception { 5 | public string Title { get; } 6 | 7 | internal AppException(string title, string message) : base(message) { 8 | this.Title = title; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/IContextMenuBuilder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Browser.Interfaces { 4 | public interface IContextMenuBuilder { 5 | void AddAction(string name, Action action); 6 | void AddActionWithCheck(string name, bool isChecked, Action action); 7 | void AddSeparator(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/disable_clipboard_formatting.js: -------------------------------------------------------------------------------- 1 | import { $TD } from "../api/bridge.js"; 2 | 3 | /** 4 | * Removes HTML styles when copying HTML content to clipboard. 5 | */ 6 | export default function() { 7 | document.addEventListener("copy", function() { 8 | window.setTimeout($TD.fixClipboard, 0); 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IFrameAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IFrameAdapter { 3 | bool IsValid(T frame); 4 | bool IsMain(T frame); 5 | void LoadUrl(T frame, string url); 6 | void ExecuteJavaScriptAsync(T frame, string script, string identifier, int startLine = 1); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /resources/Plugins/clear-columns/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Clear column shortcuts 3 | 4 | [description] 5 | Adds convenient buttons and keyboard shortcuts to clear/restore individual or all columns. 6 | When enabled, the list of keyboard shortcuts is available in the [Settings] menu. 7 | 8 | [author] 9 | chylex 10 | 11 | [requires] 12 | {version} -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Contexts/Notification.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Contexts { 2 | public struct Notification { 3 | public string? TweetUrl { get; } 4 | public string? QuoteUrl { get; } 5 | 6 | public Notification(string? tweetUrl, string? quoteUrl) { 7 | TweetUrl = tweetUrl; 8 | QuoteUrl = quoteUrl; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /resources/Plugins/reply-account/.meta: -------------------------------------------------------------------------------- 1 | [name] 2 | Customizable reply account 3 | 4 | [author] 5 | chylex 6 | 7 | [description] 8 | Allows configuring which account is pre-selected for replies in each column. 9 | 10 | [configfile] 11 | configuration.js 12 | 13 | [configdefault] 14 | configuration.default.js 15 | 16 | [requires] 17 | {version} -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Contexts/Context.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Contexts { 2 | public sealed class Context { 3 | public Tweet? Tweet { get; set; } 4 | public Link? Link { get; set; } 5 | public Media? Media { get; set; } 6 | public Selection? Selection { get; set; } 7 | public Notification? Notification { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /resources/Content/notification/handle_show_this_thread_link.js: -------------------------------------------------------------------------------- 1 | import { $TD } from "../api/bridge.js"; 2 | 3 | /** 4 | * Handles clicking on the 'Show this thread' link. 5 | */ 6 | export default function() { 7 | document.getElementById("tduck-show-thread")?.addEventListener("click", function(){ 8 | $TD.showTweetDetail(); 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/disable_tweetdeck_preview.js: -------------------------------------------------------------------------------- 1 | import { TD } from "../api/td.js"; 2 | 3 | export default function() { 4 | const overlay = TD.config.config_overlay || (TD.config.config_overlay = {}); 5 | overlay["tweetdeck_gryphon_beta_enabled"] = { value: false }; 6 | overlay["tweetdeck_gryphon_beta_bypass_enabled"] = { value: false }; 7 | } 8 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Notifications/INotificationInterface.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Features.Notifications { 2 | public interface INotificationInterface { 3 | bool FreezeTimer { get; set; } 4 | bool IsHovered { get; } 5 | 6 | void DisplayTooltip(string? text); 7 | void FinishCurrentNotification(); 8 | void ShowTweetDetail(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /linux/Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 0.1.220-* 6 | all 7 | 8 | 9 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/ready_plugins.js: -------------------------------------------------------------------------------- 1 | import { onAppReady } from "../api/ready.js"; 2 | import { ensurePropertyExists } from "../api/utils.js"; 3 | 4 | /** 5 | * Dispatches the 'Ready' event to all enabled plugins. 6 | */ 7 | export default function() { 8 | ensurePropertyExists(window, "TD_PLUGINS"); 9 | onAppReady(() => window.TD_PLUGINS.onReady()); 10 | }; 11 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Contexts/Media.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.Contexts { 2 | public readonly struct Media { 3 | public Type MediaType { get; } 4 | public string Url { get; } 5 | 6 | public Media(Type mediaType, string url) { 7 | MediaType = mediaType; 8 | Url = url; 9 | } 10 | 11 | public enum Type { 12 | Image, 13 | Video 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/globals/reload_browser.js: -------------------------------------------------------------------------------- 1 | let isReloading = false; 2 | 3 | /** 4 | * Reloads the website with memory cleanup if available. 5 | */ 6 | export function reloadBrowser() { 7 | if (isReloading) { 8 | return; 9 | } 10 | 11 | if ("gc" in window) { 12 | window.gc(); 13 | } 14 | 15 | isReloading = true; 16 | window.location.reload(); 17 | } 18 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IFileDialogOpener.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using TweetLib.Utils.Dialogs; 4 | 5 | namespace TweetLib.Browser.CEF.Interfaces { 6 | public interface IFileDialogOpener { 7 | void OpenFile(string title, bool multiple, List filters, Action onAccepted, Action onCancelled); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.idea/.idea.TweetDuck/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Utils/CefActionTask.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xilium.CefGlue; 3 | 4 | namespace TweetImpl.CefGlue.Utils { 5 | sealed class CefActionTask : CefTask { 6 | private readonly Action action; 7 | 8 | public CefActionTask(Action action) { 9 | this.action = action; 10 | } 11 | 12 | protected override void Execute() { 13 | action(); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /linux/.idea/.idea.TweetDuck.Linux/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /resources/Content/login/setup_document_attributes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sets up attributes on the element for styling login/logout pages. 3 | */ 4 | export default function() { 5 | if (location.pathname === "/login") { 6 | document.documentElement.setAttribute("login", ""); 7 | } 8 | else if (location.pathname === "/logout") { 9 | document.documentElement.setAttribute("logout", ""); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/ResponseProcessorUtf8.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | 3 | namespace TweetLib.Browser.Interfaces { 4 | public abstract class ResponseProcessorUtf8 : IResponseProcessor { 5 | byte[] IResponseProcessor.Process(byte[] response) { 6 | return Encoding.UTF8.GetBytes(Process(Encoding.UTF8.GetString(response))); 7 | } 8 | 9 | protected abstract string Process(string response); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Dialogs/SaveFileDialogSettings.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace TweetLib.Utils.Dialogs { 4 | public sealed class SaveFileDialogSettings { 5 | public string DialogTitle { get; init; } = "Save File"; 6 | public bool OverwritePrompt { get; init; } = true; 7 | public string? FileName { get; init; } 8 | public IReadOnlyList? Filters { get; init; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /resources/Content/notification/setup_body_hover_class.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Adds a class to the element when hovering the notification. 3 | */ 4 | export default function() { 5 | document.body.addEventListener("mouseenter", function(){ 6 | document.body.classList.add("td-hover"); 7 | }); 8 | 9 | document.body.addEventListener("mouseleave", function(){ 10 | document.body.classList.remove("td-hover"); 11 | }); 12 | }; 13 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IResponseAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IResponseAdapter { 3 | void SetCharset(T response, string charset); 4 | void SetMimeType(T response, string mimeType); 5 | void SetStatus(T response, int statusCode, string statusText); 6 | void SetHeader(T response, string header, string value); 7 | string? GetHeader(T response, string header); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Adapters/CefAdapter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using CefSharp; 3 | using TweetLib.Browser.CEF.Interfaces; 4 | 5 | namespace TweetImpl.CefSharp.Adapters { 6 | sealed class CefAdapter : ICefAdapter { 7 | public static CefAdapter Instance { get; } = new (); 8 | 9 | private CefAdapter() {} 10 | 11 | public void RunOnUiThread(Action action) { 12 | Cef.UIThreadTaskFactory.StartNew(action); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Serialization/SerializationSoftException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace TweetLib.Utils.Serialization { 5 | public sealed class SerializationSoftException : Exception { 6 | public IList Errors { get; } 7 | 8 | internal SerializationSoftException(IList errors) : base(string.Join(Environment.NewLine, errors)) { 9 | this.Errors = errors; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/..code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "name": "Installers", 5 | "path": "..\\bld" 6 | }, 7 | { 8 | "name": "Resources", 9 | "path": "." 10 | } 11 | ], 12 | "settings": { 13 | "editor.tabSize": 2, 14 | "javascript.validate.enable": false, 15 | "files.autoGuessEncoding": false, 16 | "files.insertFinalNewline": true, 17 | "files.trimFinalNewlines": true, 18 | "files.encoding": "utf8", 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Plugins/Events/PluginChangedStateEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Core.Features.Plugins.Events { 4 | internal sealed class PluginChangedStateEventArgs : EventArgs { 5 | public Plugin Plugin { get; } 6 | public bool IsEnabled { get; } 7 | 8 | public PluginChangedStateEventArgs(Plugin plugin, bool isEnabled) { 9 | this.Plugin = plugin; 10 | this.IsEnabled = isEnabled; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Plugins/Events/PluginErrorEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace TweetLib.Core.Features.Plugins.Events { 5 | internal sealed class PluginErrorEventArgs : EventArgs { 6 | public bool HasErrors => Errors.Count > 0; 7 | 8 | public IList Errors { get; } 9 | 10 | internal PluginErrorEventArgs(IList errors) { 11 | this.Errors = errors; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Updates/UpdateCheckEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Utils.Data; 3 | 4 | namespace TweetLib.Core.Systems.Updates { 5 | public sealed class UpdateCheckEventArgs : EventArgs { 6 | public int EventId { get; } 7 | public Result Result { get; } 8 | 9 | internal UpdateCheckEventArgs(int eventId, Result result) { 10 | this.EventId = eventId; 11 | this.Result = result; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/tweetdeck_preview_warning.js: -------------------------------------------------------------------------------- 1 | import { $TD } from "../api/bridge.js"; 2 | 3 | export default function() { 4 | if (location.pathname === "/" && !("TD" in window)) { 5 | $TD.alert("warning", "Some TweetDuck features failed to load. This might happen if your Twitter account is enrolled into the TweetDeck Preview, which TweetDuck does not support. Try opting out of the TweetDeck Preview to restore TweetDuck's functionality."); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /linux/TweetDuck/Configuration/SystemConfiguration.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Core.Application; 2 | using TweetLib.Core.Systems.Configuration; 3 | 4 | namespace TweetDuck.Configuration { 5 | sealed class SystemConfiguration : IConfigObject, IAppSystemConfiguration { 6 | public bool UseSystemProxyForAllConnections => true; 7 | 8 | public SystemConfiguration ConstructWithDefaults() { 9 | return new SystemConfiguration(); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /linux/TweetDuck/Resources/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | APPVERSION="$("$1TweetDuck" -appversion)" 4 | LIBVERSION="$("$1TweetDuck" -pluginversion)" 5 | INTRO="TweetDuck version $APPVERSION" 6 | 7 | DASHES=$(seq 1 ${#INTRO}) 8 | printf "%0.s-" $DASHES 9 | printf "\n$INTRO\nLibrary version $LIBVERSION\n" 10 | printf "%0.s-" $DASHES 11 | printf "\n" 12 | 13 | find "$1plugins/" -type f -name ".meta" -exec echo "Processed {}" \; -exec sed -i "s/{version}/$LIBVERSION/" {} \; 14 | -------------------------------------------------------------------------------- /windows/TweetDuck/Controls/FlatButton.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace TweetDuck.Controls { 5 | sealed class FlatButton : Button { 6 | protected override bool ShowFocusCues => false; 7 | 8 | public FlatButton() { 9 | GotFocus += FlatButton_GotFocus; 10 | } 11 | 12 | private void FlatButton_GotFocus(object? sender, EventArgs e) { // removes extra border when focused 13 | NotifyDefault(false); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /windows/TweetDuck/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/fix_os_name.js: -------------------------------------------------------------------------------- 1 | import { TD } from "../api/td.js"; 2 | import { ensurePropertyExists } from "../api/utils.js"; 3 | 4 | /** 5 | * Fixes broken OS detection. 6 | */ 7 | export default function() { 8 | const doc = document.documentElement; 9 | doc.classList.remove("os-"); 10 | doc.classList.add("os-windows"); 11 | 12 | ensurePropertyExists(TD, "util", "getOSName"); 13 | 14 | TD.util.getOSName = function() { 15 | return "windows"; 16 | }; 17 | }; 18 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IBrowserWrapper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.CEF.Data; 3 | 4 | namespace TweetLib.Browser.CEF.Interfaces { 5 | public interface IBrowserWrapper where TFrame : IDisposable { 6 | string Url { get; } 7 | TFrame MainFrame { get; } 8 | 9 | void AddWordToDictionary(string word); 10 | TRequest CreateGetRequest(); 11 | void RequestDownload(TFrame frame, TRequest request, DownloadCallbacks callbacks); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/TweetLib.Communication/TweetLib.Communication.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | x86 6 | 11 7 | enable 8 | false 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Adapters/CefAdapter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetImpl.CefGlue.Utils; 3 | using TweetLib.Browser.CEF.Interfaces; 4 | using Xilium.CefGlue; 5 | 6 | namespace TweetImpl.CefGlue.Adapters { 7 | sealed class CefAdapter : ICefAdapter { 8 | public static CefAdapter Instance { get; } = new (); 9 | 10 | private CefAdapter() {} 11 | 12 | public void RunOnUiThread(Action action) { 13 | CefRuntime.PostTask(CefThreadId.UI, new CefActionTask(action)); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/globals/reload_columns.js: -------------------------------------------------------------------------------- 1 | import { TD } from "../../api/td.js"; 2 | import { checkPropertyExists, noop } from "../../api/utils.js"; 3 | 4 | function isSupported() { 5 | return checkPropertyExists(TD, "controller", "columnManager", "getAll"); 6 | } 7 | 8 | function reloadColumnsImpl() { 9 | Object.values(TD.controller.columnManager.getAll()).forEach(column => column.reloadTweets()); 10 | } 11 | 12 | export const reloadColumns = isSupported() ? reloadColumnsImpl : noop; 13 | -------------------------------------------------------------------------------- /windows/TweetDuck/Controls/FlowLayoutPanelNoHScroll.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | using TweetDuck.Utils; 3 | 4 | namespace TweetDuck.Controls { 5 | sealed class FlowLayoutPanelNoHScroll : FlowLayoutPanel { 6 | protected override void WndProc(ref Message m) { 7 | if (m.Msg == 0x85) { // WM_NCPAINT 8 | NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much 9 | } 10 | 11 | base.WndProc(ref m); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IJsDialogOpener.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.CEF.Dialogs; 3 | 4 | namespace TweetLib.Browser.CEF.Interfaces { 5 | public interface IJsDialogOpener { 6 | void Alert(MessageDialogType type, string title, string message, Action callback); 7 | void Confirm(MessageDialogType type, string title, string message, Action callback); 8 | void Prompt(MessageDialogType type, string title, string message, Action callback); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/Twitter/JQuery.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Core.Features.Twitter { 4 | public static class JQuery { 5 | public static int GetDatePickerDayOfWeek(DayOfWeek dow) { 6 | return dow switch { 7 | DayOfWeek.Monday => 1, 8 | DayOfWeek.Tuesday => 2, 9 | DayOfWeek.Wednesday => 3, 10 | DayOfWeek.Thursday => 4, 11 | DayOfWeek.Friday => 5, 12 | DayOfWeek.Saturday => 6, 13 | _ => 0 14 | }; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /linux/publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ ! -f "TweetDuck.Linux.sln" ]; then 5 | echo "Missing solution file in working directory!" 6 | exit 1 7 | fi 8 | 9 | mkdir -p bld/tmp/ 10 | 11 | dotnet build TweetDuck -c Release -r linux-x64 -o bld/tmp/ 12 | rm bld/tmp/ref/* 13 | rm -r bld/tmp/ref/ 14 | 15 | echo "Packaging build..." 16 | tar czvf bld/TweetDuck.$("bld/tmp/TweetDuck" -appversion).tar.gz -C bld/tmp/ --owner=0 --group=0 --format=v7 . 17 | 18 | rm -rf bld/tmp/ 19 | 20 | echo "Done!" 21 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/register_global_functions_jquery.js: -------------------------------------------------------------------------------- 1 | import { $ } from "../api/jquery.js"; 2 | import { prioritizeNewestEvent } from "./globals/prioritize_newest_event.js"; 3 | import { showTweetDetail } from "./globals/show_tweet_detail.js"; 4 | 5 | /** 6 | * Registers global functions which require jQuery. 7 | */ 8 | export default function() { 9 | window.jQuery = $; 10 | window.TDGF_prioritizeNewestEvent = prioritizeNewestEvent; 11 | window.TDGF_showTweetDetail = showTweetDetail; 12 | }; 13 | -------------------------------------------------------------------------------- /windows/TweetDuck/Controls/NumericUpDownEx.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Windows.Forms; 3 | 4 | namespace TweetDuck.Controls { 5 | sealed class NumericUpDownEx : NumericUpDown { 6 | public string? TextSuffix { get; set; } 7 | 8 | protected override void UpdateEditText() { 9 | base.UpdateEditText(); 10 | 11 | if (LicenseManager.UsageMode != LicenseUsageMode.Designtime) { 12 | ChangingText = true; 13 | Text += TextSuffix; 14 | ChangingText = false; 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/TweetLib.Utils.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | Debug;Release 6 | x86;x64 7 | 11 8 | enable 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Base/BaseBrowser.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.Interfaces; 3 | 4 | namespace TweetLib.Browser.Base { 5 | public class BaseBrowser : IDisposable where T : BaseBrowser { 6 | protected readonly IBrowserComponent browserComponent; 7 | 8 | protected BaseBrowser(IBrowserComponent browserComponent, Func setup) { 9 | this.browserComponent = browserComponent; 10 | this.browserComponent.Setup(setup((T) this)); 11 | } 12 | 13 | public virtual void Dispose() {} 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/TweetLib.Browser.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | Debug;Release 6 | x86;x64 7 | 11 8 | enable 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Updates/UpdateDownloadStatus.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Systems.Updates { 2 | public enum UpdateDownloadStatus { 3 | None = 0, 4 | InProgress, 5 | Canceled, 6 | AssetMissing, 7 | Failed, 8 | Done 9 | } 10 | 11 | public static class UpdateDownloadStatusExtensions { 12 | public static bool IsFinished(this UpdateDownloadStatus status, bool canRetry) { 13 | return status is UpdateDownloadStatus.AssetMissing or UpdateDownloadStatus.Done || (status == UpdateDownloadStatus.Failed && !canRetry); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IMenuModelAdapter.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Browser.CEF.Interfaces { 2 | public interface IMenuModelAdapter { 3 | int GetItemCount(T model); 4 | 5 | void AddCommand(T model, int command, string name); 6 | int GetCommandAt(T model, int index); 7 | 8 | void AddCheckCommand(T model, int command, string name); 9 | void SetChecked(T model, int command, bool isChecked); 10 | 11 | void AddSeparator(T model); 12 | bool IsSeparatorAt(T model, int index); 13 | 14 | void RemoveAt(T model, int index); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Serialization/TypeConverterRegistry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace TweetLib.Utils.Serialization { 5 | public sealed class TypeConverterRegistry { 6 | private readonly Dictionary converters = new (); 7 | 8 | public void Register(Type type, ITypeConverter converter) { 9 | converters[type] = converter; 10 | } 11 | 12 | internal ITypeConverter? TryGet(Type type) { 13 | return converters.TryGetValue(type, out var converter) ? converter : null; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/focus_composer_after_image_upload.js: -------------------------------------------------------------------------------- 1 | import { $, ensureEventExists } from "../api/jquery.js"; 2 | import { onAppReady } from "../api/ready.js"; 3 | 4 | /** 5 | * Refocuses composer input after uploading an image. 6 | */ 7 | export default function() { 8 | onAppReady(function focusComposerAfterImageUpload() { 9 | ensureEventExists(document, "uiComposeImageAdded"); 10 | 11 | $(document).on("uiComposeImageAdded", function() { 12 | document.querySelector(".js-docked-compose .js-compose-text").focus(); 13 | }); 14 | }); 15 | }; 16 | -------------------------------------------------------------------------------- /linux/TweetDuck/Browser/Base/PopupHandler.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.CEF.Interfaces; 2 | using TweetLib.Core; 3 | using TweetLib.Core.Features.Twitter; 4 | 5 | namespace TweetDuck.Browser.Base { 6 | sealed class PopupHandler : IPopupHandler { 7 | public static PopupHandler Instance { get; } = new (); 8 | 9 | private PopupHandler() {} 10 | 11 | public bool IsPopupAllowed(string url) { 12 | return TwitterUrls.IsAllowedPopupUrl(url); 13 | } 14 | 15 | public void OpenExternalBrowser(string url) { 16 | App.SystemHandler.OpenBrowser(url); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /windows/TweetDuck/Browser/Base/PopupHandler.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.CEF.Interfaces; 2 | using TweetLib.Core; 3 | using TweetLib.Core.Features.Twitter; 4 | 5 | namespace TweetDuck.Browser.Base { 6 | sealed class PopupHandler : IPopupHandler { 7 | public static PopupHandler Instance { get; } = new (); 8 | 9 | private PopupHandler() {} 10 | 11 | public bool IsPopupAllowed(string url) { 12 | return TwitterUrls.IsAllowedPopupUrl(url); 13 | } 14 | 15 | public void OpenExternalBrowser(string url) { 16 | App.SystemHandler.OpenBrowser(url); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /windows/TweetDuck.Video/Controls/ControlWMP.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.ComponentModel; 3 | using System.Windows.Forms; 4 | using WMPLib; 5 | 6 | namespace TweetDuck.Video.Controls { 7 | [DesignTimeVisible(true)] 8 | [Clsid("{6bf52a52-394a-11d3-b153-00c04f79faa6}")] 9 | sealed class ControlWMP : AxHost { 10 | public WindowsMediaPlayer? Ocx { get; private set; } 11 | 12 | public ControlWMP() : base("6bf52a52-394a-11d3-b153-00c04f79faa6") {} 13 | 14 | protected override void AttachInterfaces() { 15 | Ocx = (WindowsMediaPlayer) GetOcx(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /windows/TweetDuck/Application/MessageDialogs.cs: -------------------------------------------------------------------------------- 1 | using TweetDuck.Dialogs; 2 | using TweetDuck.Management; 3 | using TweetLib.Core.Application; 4 | 5 | namespace TweetDuck.Application { 6 | sealed class MessageDialogs : IAppMessageDialogs { 7 | public void Information(string caption, string text) { 8 | FormManager.RunOnUIThreadAsync(() => FormMessage.Information(caption, text, FormMessage.OK)); 9 | } 10 | 11 | public void Error(string caption, string text) { 12 | FormManager.RunOnUIThreadAsync(() => FormMessage.Error(caption, text, FormMessage.OK)); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /linux/TweetDuck/Browser/Base/CefBrowserComponent.cs: -------------------------------------------------------------------------------- 1 | using Gtk; 2 | using Lunixo.ChromiumGtk; 3 | using TweetImpl.CefGlue.Component; 4 | using TweetLib.Browser.CEF.Utils; 5 | using TweetLib.Core; 6 | 7 | namespace TweetDuck.Browser.Base { 8 | sealed class CefBrowserComponent : BrowserComponentBase { 9 | public override string CacheFolder => CefUtils.GetCacheFolder(App.StoragePath); 10 | 11 | public CefBrowserComponent(Window window, WebView view, CreateContextMenu createContextMenu, bool autoReload = true) : base(window, view.Browser, createContextMenu, autoReload) {} 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/inject_css.js: -------------------------------------------------------------------------------- 1 | function createStyle(id, styles) { 2 | const ele = document.createElement("style"); 3 | ele.id = id; 4 | ele.innerText = styles; 5 | document.head.appendChild(ele); 6 | } 7 | 8 | /** 9 | * Adds support for injecting CSS. 10 | */ 11 | export default function() { 12 | /** 13 | * @param {string|null} styles 14 | */ 15 | window.TDGF_reinjectCustomCSS = function(styles) { 16 | document.getElementById("tweetduck-custom-css")?.remove(); 17 | 18 | if (styles?.length) { 19 | createStyle("tweetduck-custom-css", styles); 20 | } 21 | }; 22 | }; 23 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Configuration/ConfigObjects.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Core.Application; 2 | using TweetLib.Core.Features.Plugins.Config; 3 | 4 | namespace TweetLib.Core.Systems.Configuration { 5 | public sealed class ConfigObjects where TUser : IAppUserConfiguration where TSystem : IConfigObject { 6 | public TUser User { get; } 7 | public TSystem System { get; } 8 | public PluginConfig Plugins { get; } 9 | 10 | public ConfigObjects(TUser user, TSystem system, PluginConfig plugins) { 11 | User = user; 12 | System = system; 13 | Plugins = plugins; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /windows/TweetDuck/Dialogs/Settings/TabSettingsFeedback.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Core; 3 | 4 | namespace TweetDuck.Dialogs.Settings { 5 | sealed partial class TabSettingsFeedback : FormSettings.BaseTab { 6 | public TabSettingsFeedback() { 7 | InitializeComponent(); 8 | } 9 | 10 | public override void OnReady() { 11 | btnSendFeedback.Click += btnSendFeedback_Click; 12 | } 13 | 14 | #region Feedback 15 | 16 | private void btnSendFeedback_Click(object? sender, EventArgs e) { 17 | App.SystemHandler.OpenBrowser(Lib.IssueTrackerUrl + "/new"); 18 | } 19 | 20 | #endregion 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/skip_pre_login_page.js: -------------------------------------------------------------------------------- 1 | import { replaceFunction } from "../api/patch.js"; 2 | import { TD } from "../api/td.js"; 3 | import { ensurePropertyExists } from "../api/utils.js"; 4 | 5 | /** 6 | * Skips the pre-login page so that users immediately see the login page. 7 | */ 8 | export default function() { 9 | ensurePropertyExists(TD, "controller", "init"); 10 | 11 | replaceFunction(TD.controller.init, "showLogin", function() { 12 | location.href = "https://twitter.com/login?hide_message=true&redirect_after_login=https%3A%2F%2Ftweetdeck.twitter.com%2F%3Fvia_twitter_login%3Dtrue"; 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Adapters/CefErrorCodeAdapter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using CefSharp; 3 | using TweetLib.Browser.CEF.Interfaces; 4 | 5 | namespace TweetImpl.CefSharp.Adapters { 6 | sealed class CefErrorCodeAdapter : IErrorCodeAdapter { 7 | public static CefErrorCodeAdapter Instance { get; } = new (); 8 | 9 | private CefErrorCodeAdapter() {} 10 | 11 | public bool IsAborted(CefErrorCode errorCode) { 12 | return errorCode == CefErrorCode.Aborted; 13 | } 14 | 15 | public string? GetName(CefErrorCode errorCode) { 16 | return Enum.GetName(typeof(CefErrorCode), errorCode); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/TweetLib.Utils/Startup/UnlockResult.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace TweetLib.Utils.Startup { 4 | public class UnlockResult { 5 | private readonly string name; 6 | 7 | private UnlockResult(string name) { 8 | this.name = name; 9 | } 10 | 11 | public override string ToString() { 12 | return name; 13 | } 14 | 15 | public static UnlockResult Success { get; } = new ("Success"); 16 | 17 | public sealed class Fail : UnlockResult { 18 | public Exception Exception { get; } 19 | 20 | internal Fail(Exception exception) : base("Fail") { 21 | this.Exception = exception; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/Content/notification/add_skip_button.js: -------------------------------------------------------------------------------- 1 | import { $TD } from "../api/bridge.js"; 2 | 3 | const iconHTML = ` 4 | 5 | 6 | `; 7 | 8 | /** 9 | * Adds an icon button that skips to the next notification. 10 | */ 11 | export default function() { 12 | document.body.children[0].insertAdjacentHTML("beforeend", iconHTML); 13 | 14 | document.getElementById("td-skip").addEventListener("click", function() { 15 | $TD.loadNextNotification(); 16 | }); 17 | }; 18 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/configure_language_for_translations.js: -------------------------------------------------------------------------------- 1 | import { $TDX } from "../api/bridge.js"; 2 | import { replaceFunction } from "../api/patch.js"; 3 | import { TD } from "../api/td.js"; 4 | import { ensurePropertyExists } from "../api/utils.js"; 5 | 6 | /** 7 | * Sets language for automatic translations. 8 | */ 9 | export default function() { 10 | ensurePropertyExists(TD, "languages"); 11 | 12 | replaceFunction(TD.languages, "getSystemLanguageCode", function(func, args) { 13 | const [ returnShortCode ] = args; 14 | return returnShortCode ? ($TDX.translationTarget || "en") : func.apply(this, args); 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppSetup.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Request; 2 | using TweetLib.Core.Features.Plugins; 3 | using TweetLib.Core.Systems.Configuration; 4 | 5 | namespace TweetLib.Core.Application { 6 | public interface IAppSetup { 7 | bool IsPortable { get; } 8 | bool IsDebugLogging { get; } 9 | string? CustomDataFolder { get; } 10 | string? ResourceRewriteRules { get; } 11 | 12 | ConfigManager CreateConfigManager(string storagePath); 13 | 14 | bool TryLockDataFolder(string lockFile); 15 | 16 | void BeforeLaunch(); 17 | 18 | void Launch(ResourceCache resourceCache, PluginManager pluginManager); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/TweetDeck/VendorScriptProcessor.cs: -------------------------------------------------------------------------------- 1 | using System.Text.RegularExpressions; 2 | using TweetLib.Browser.Interfaces; 3 | 4 | namespace TweetLib.Core.Features.TweetDeck { 5 | sealed class VendorScriptProcessor : ResponseProcessorUtf8 { 6 | public static VendorScriptProcessor Instance { get; } = new (); 7 | 8 | private static readonly Regex RegexRestoreJQuery = new (@"(\w+)\.fn=\1\.prototype", RegexOptions.Compiled); 9 | 10 | private VendorScriptProcessor() {} 11 | 12 | protected override string Process(string response) { 13 | return RegexRestoreJQuery.Replace(response, "window.$$=$1;$&", 1); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Adapters/CefErrorCodeAdapter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.CEF.Interfaces; 3 | using Xilium.CefGlue; 4 | 5 | namespace TweetImpl.CefGlue.Adapters { 6 | sealed class CefErrorCodeAdapter : IErrorCodeAdapter { 7 | public static CefErrorCodeAdapter Instance { get; } = new (); 8 | 9 | private CefErrorCodeAdapter() {} 10 | 11 | public bool IsAborted(CefErrorCode errorCode) { 12 | return errorCode == CefErrorCode.Aborted; 13 | } 14 | 15 | public string GetName(CefErrorCode errorCode) { 16 | return Enum.GetName(typeof(CefErrorCode), errorCode) ?? string.Empty; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/move_accounts_above_hashtags_in_search.js: -------------------------------------------------------------------------------- 1 | import { onAppReady } from "../api/ready.js"; 2 | 3 | /** 4 | * Reorders search results so that accounts are above hashtags. 5 | */ 6 | export default function() { 7 | onAppReady(function moveAccountsAboveHashtagsInSearch() { 8 | const container = document.querySelector(".js-search-in-popover"); 9 | 10 | const users = container.querySelector(".js-typeahead-user-list"); 11 | const hashtags = container.querySelector(".js-typeahead-topic-list"); 12 | 13 | hashtags.insertAdjacentElement("beforebegin", users); 14 | hashtags.classList.add("list-divider"); 15 | }); 16 | }; 17 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/globals/get_class_style_property.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves the actual value of a CSS property of an element with the specified class. 3 | * @param {string} elementClass 4 | * @param {string} cssProperty 5 | * @returns {string} 6 | */ 7 | export function getClassStyleProperty(elementClass, cssProperty) { 8 | const column = document.createElement("div"); 9 | column.classList.add(elementClass); 10 | column.style.display = "none"; 11 | 12 | document.body.appendChild(column); 13 | const value = window.getComputedStyle(column).getPropertyValue(cssProperty); 14 | document.body.removeChild(column); 15 | 16 | return value; 17 | } 18 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Adapters/CefJsDialogCallbackAdapter.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.CEF.Interfaces; 2 | using Xilium.CefGlue; 3 | 4 | namespace TweetImpl.CefGlue.Adapters { 5 | sealed class CefJsDialogCallbackAdapter : IJsDialogCallbackAdapter { 6 | public static CefJsDialogCallbackAdapter Instance { get; } = new (); 7 | 8 | private CefJsDialogCallbackAdapter() {} 9 | 10 | public void Continue(CefJSDialogCallback callback, bool success, string? userInput = null) { 11 | callback.Continue(success, userInput); 12 | } 13 | 14 | public void Dispose(CefJSDialogCallback callback) { 15 | callback.Dispose(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Application/IAppSystemHandler.cs: -------------------------------------------------------------------------------- 1 | namespace TweetLib.Core.Application { 2 | public interface IAppSystemHandler { 3 | void OpenBrowser(string? url); 4 | void OpenFileExplorer(string path); 5 | 6 | OpenAssociatedProgramFunc? OpenAssociatedProgram { get; } 7 | CopyImageFromFileFunc? CopyImageFromFile { get; } 8 | CopyTextFunc? CopyText { get; } 9 | SearchTextFunc? SearchText { get; } 10 | 11 | public delegate void OpenAssociatedProgramFunc(string path); 12 | 13 | public delegate void CopyImageFromFileFunc(string path); 14 | 15 | public delegate void CopyTextFunc(string text); 16 | 17 | public delegate void SearchTextFunc(string text); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/globals/prioritize_newest_event.js: -------------------------------------------------------------------------------- 1 | import { getEvents } from "../../api/jquery.js"; 2 | 3 | /** 4 | * Pushes the newest jQuery event to the beginning of the event handler list, so that it runs before anything else. 5 | * @param {EventTarget} element 6 | * @param {string} eventName 7 | */ 8 | export function prioritizeNewestEvent(element, eventName) { 9 | const events = getEvents(element); 10 | 11 | const handlers = events[eventName]; 12 | const newHandler = handlers[handlers.length - 1]; 13 | 14 | for (let index = handlers.length - 1; index > 0; index--) { 15 | handlers[index] = handlers[index - 1]; 16 | } 17 | 18 | handlers[0] = newHandler; 19 | } 20 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Interfaces/IRequestAdapter.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Request; 2 | 3 | namespace TweetLib.Browser.CEF.Interfaces { 4 | public interface IRequestAdapter { 5 | ulong GetIdentifier(T request); 6 | 7 | string GetUrl(T request); 8 | 9 | void SetUrl(T request, string url); 10 | 11 | void SetMethod(T request, string method); 12 | 13 | bool IsTransitionForwardBack(T request); 14 | 15 | bool IsCspReport(T request); 16 | 17 | ResourceType GetResourceType(T request); 18 | 19 | void SetHeader(T request, string header, string value); 20 | 21 | void SetReferrer(T request, string referrer); 22 | 23 | void SetAllowStoredCredentials(T request); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Interfaces/IBrowserComponent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using TweetLib.Browser.Base; 3 | using TweetLib.Browser.Events; 4 | 5 | namespace TweetLib.Browser.Interfaces { 6 | public interface IBrowserComponent : IScriptExecutor { 7 | string Url { get; } 8 | string CacheFolder { get; } 9 | 10 | event EventHandler BrowserLoaded; 11 | event EventHandler PageLoadStart; 12 | event EventHandler PageLoadEnd; 13 | 14 | void Setup(BrowserSetup setup); 15 | void AttachBridgeObject(string name, object bridge); 16 | void DownloadFile(string url, string path, Action? onSuccess, Action? onError); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser/Request/RequestHandleResult.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.Interfaces; 2 | 3 | namespace TweetLib.Browser.Request { 4 | public class RequestHandleResult { 5 | public static RequestHandleResult Cancel { get; } = new (); 6 | 7 | private RequestHandleResult() {} 8 | 9 | public sealed class Redirect : RequestHandleResult { 10 | public string Url { get; } 11 | 12 | public Redirect(string url) { 13 | Url = url; 14 | } 15 | } 16 | 17 | public sealed class Process : RequestHandleResult { 18 | public IResponseProcessor Processor { get; } 19 | 20 | public Process(IResponseProcessor processor) { 21 | Processor = processor; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/register_composer_active_event.js: -------------------------------------------------------------------------------- 1 | import { $ } from "../api/jquery.js"; 2 | 3 | /** 4 | * Creates a `tduckOldComposerActive` event on the `document` object, which triggers when the composer is activated. 5 | */ 6 | export default function() { 7 | /** 8 | * @param e 9 | * @param {{ activeDrawer: string }} data 10 | */ 11 | const onDrawerEvent = function(e, data) { 12 | if (e.type === "uiDrawerActive" && data.activeDrawer !== "compose") { 13 | return; 14 | } 15 | 16 | setTimeout(function() { 17 | $(document).trigger("tduckOldComposerActive"); 18 | }, 0); 19 | }; 20 | 21 | $(document).on("uiDrawerActive uiRwebComposerOptOut", onDrawerEvent); 22 | }; 23 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Handlers/CefResourceHandlerFactory.cs: -------------------------------------------------------------------------------- 1 | using CefSharp; 2 | using TweetLib.Browser.CEF.Data; 3 | using TweetLib.Browser.CEF.Interfaces; 4 | 5 | namespace TweetImpl.CefSharp.Handlers { 6 | sealed class CefResourceHandlerFactory : IResourceHandlerFactory { 7 | public static CefResourceHandlerFactory Instance { get; } = new (); 8 | 9 | private CefResourceHandlerFactory() {} 10 | 11 | public IResourceHandler CreateResourceHandler(ByteArrayResource resource) { 12 | return new CefByteArrayResourceHandler(resource); 13 | } 14 | 15 | public string GetMimeTypeFromExtension(string extension) { 16 | return Cef.GetMimeType(extension); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Features/ICommonInterface.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using TweetLib.Core.Features.Notifications; 3 | 4 | namespace TweetLib.Core.Features { 5 | public interface ICommonInterface { 6 | void Alert(string type, string contents); 7 | void DisplayTooltip(string? text); 8 | void FixClipboard(); 9 | int GetIdleSeconds(); 10 | void OnSoundNotification(); 11 | void PlayVideo(string videoUrl, string tweetUrl, string username, object callShowOverlay); 12 | void ScreenshotTweet(string html, int width); 13 | void ShowDesktopNotification(DesktopNotification notification); 14 | void StopVideo(); 15 | 16 | Task ExecuteCallback(object callback, params object[] parameters); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/Content/login/redirect_plain_twitter_com.js: -------------------------------------------------------------------------------- 1 | import { replaceFunction } from "../api/patch.js"; 2 | 3 | function redirectToTweetDeck() { 4 | location.href = "https://tweetdeck.twitter.com"; 5 | } 6 | 7 | function hookHistoryStateFunction(func, args) { 8 | debugger; 9 | if (args[2] === "/") { 10 | redirectToTweetDeck(); 11 | } 12 | else { 13 | func.apply(this, args); 14 | } 15 | } 16 | 17 | /** 18 | * Redirects plain twitter.com to TweetDeck, so that users cannot accidentally land on twitter.com login. 19 | */ 20 | export default function() { 21 | replaceFunction(window.history, "pushState", hookHistoryStateFunction); 22 | replaceFunction(window.history, "replaceState", hookHistoryStateFunction); 23 | }; 24 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Adapters/CefDragDataAdapter.cs: -------------------------------------------------------------------------------- 1 | using CefSharp; 2 | using TweetLib.Browser.CEF.Interfaces; 3 | 4 | namespace TweetImpl.CefSharp.Adapters { 5 | sealed class CefDragDataAdapter : IDragDataAdapter { 6 | public static CefDragDataAdapter Instance { get; } = new (); 7 | 8 | private CefDragDataAdapter() {} 9 | 10 | public bool IsLink(IDragData data) { 11 | return data.IsLink; 12 | } 13 | 14 | public string GetLink(IDragData data) { 15 | return data.LinkUrl; 16 | } 17 | 18 | public bool IsFragment(IDragData data) { 19 | return data.IsFragment; 20 | } 21 | 22 | public string GetFragmentAsText(IDragData data) { 23 | return data.FragmentText; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /linux/TweetDuck/Utils/WindowManager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using Gtk; 4 | using Lunixo.ChromiumGtk.Interop; 5 | 6 | namespace TweetDuck.Utils { 7 | static class WindowManager { 8 | public static Window? MainWindow { get; private set; } 9 | 10 | public static Window CreateWindow(string title) { 11 | Window window = new Window(title); 12 | window.SetIconFromFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "icon.ico")); 13 | InteropLinux.SetDefaultWindowVisual(window.Handle); 14 | return window; 15 | } 16 | 17 | public static Window CreateMainWindow(string title) { 18 | Window window = CreateWindow(title); 19 | MainWindow = window; 20 | return window; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/Data/ContextMenuActionRegistry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace TweetLib.Browser.CEF.Data { 5 | abstract class ContextMenuActionRegistry where T : notnull { 6 | private readonly Dictionary actions = new (); 7 | 8 | protected abstract T NextId(int n); 9 | 10 | public T AddAction(Action action) { 11 | T id = NextId(actions.Count); 12 | actions[id] = action; 13 | return id; 14 | } 15 | 16 | public bool Execute(T id) { 17 | if (actions.TryGetValue(id, out var action)) { 18 | action(); 19 | return true; 20 | } 21 | 22 | return false; 23 | } 24 | 25 | public void Clear() { 26 | actions.Clear(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Adapters/CefDragDataAdapter.cs: -------------------------------------------------------------------------------- 1 | using TweetLib.Browser.CEF.Interfaces; 2 | using Xilium.CefGlue; 3 | 4 | namespace TweetImpl.CefGlue.Adapters { 5 | sealed class CefDragDataAdapter : IDragDataAdapter { 6 | public static CefDragDataAdapter Instance { get; } = new (); 7 | 8 | private CefDragDataAdapter() {} 9 | 10 | public bool IsLink(CefDragData data) { 11 | return data.IsLink; 12 | } 13 | 14 | public string GetLink(CefDragData data) { 15 | return data.LinkUrl; 16 | } 17 | 18 | public bool IsFragment(CefDragData data) { 19 | return data.IsFragment; 20 | } 21 | 22 | public string GetFragmentAsText(CefDragData data) { 23 | return data.FragmentText; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/globals/get_hovered_column.js: -------------------------------------------------------------------------------- 1 | import { TD } from "../../api/td.js"; 2 | 3 | /** 4 | * Returns an object containing data about the column below the cursor. 5 | * @returns {{ ele: Element, obj: TD_Column }|null} 6 | */ 7 | export function getHoveredColumn() { 8 | const hovered = document.querySelectorAll(":hover"); 9 | 10 | for (let index = hovered.length - 1; index >= 0; index--) { 11 | const ele = hovered[index]; 12 | 13 | if (ele.tagName === "SECTION" && ele.classList.contains("js-column")) { 14 | const obj = TD.controller.columnManager.get(ele.getAttribute("data-column")); 15 | 16 | if (obj) { 17 | return { ele, obj }; 18 | } 19 | } 20 | } 21 | 22 | return null; 23 | } 24 | -------------------------------------------------------------------------------- /windows/TweetDuck/Controls/LabelVertical.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace TweetDuck.Controls { 6 | sealed class LabelVertical : Label { 7 | public int LineHeight { get; set; } 8 | 9 | protected override void OnPaint(PaintEventArgs e) { 10 | int y = (int) Math.Floor((ClientRectangle.Height - Text.Length * LineHeight) / 2F) - 1; 11 | using Brush brush = new SolidBrush(ForeColor); 12 | 13 | foreach (char chr in Text) { 14 | string str = chr.ToString(); 15 | float x = (ClientRectangle.Width - e.Graphics.MeasureString(str, Font).Width) / 2F; 16 | 17 | e.Graphics.DrawString(str, Font, brush, x, y); 18 | y += LineHeight; 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/focus_composer_after_switching_account.js: -------------------------------------------------------------------------------- 1 | import { $, $$ } from "../api/jquery.js"; 2 | import { onAppReady } from "../api/ready.js"; 3 | 4 | const refocusInput = function() { 5 | document.querySelector(".js-docked-compose .js-compose-text").focus(); 6 | }; 7 | 8 | const accountItemClickEvent = function() { 9 | setTimeout(refocusInput, 0); 10 | }; 11 | 12 | /** 13 | * Refocuses composer input after switching account. 14 | */ 15 | export default function() { 16 | onAppReady(function setupAccountSwitchRefocus() { 17 | $(document).on("tduckOldComposerActive", function() { 18 | $$(".js-account-list", ".js-docked-compose").delegate(".js-account-item", "click", accountItemClickEvent); 19 | }); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /lib/TweetLib.Browser.CEF/TweetLib.Browser.CEF.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net7.0 5 | Debug;Release 6 | x86;x64 7 | 11 8 | enable 9 | false 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Adapters/CefJsDialogCallbackAdapter.cs: -------------------------------------------------------------------------------- 1 | using CefSharp; 2 | using TweetLib.Browser.CEF.Interfaces; 3 | 4 | namespace TweetImpl.CefSharp.Adapters { 5 | sealed class CefJsDialogCallbackAdapter : IJsDialogCallbackAdapter { 6 | public static CefJsDialogCallbackAdapter Instance { get; } = new (); 7 | 8 | private CefJsDialogCallbackAdapter() {} 9 | 10 | public void Continue(IJsDialogCallback callback, bool success, string? userInput = null) { 11 | if (userInput == null) { 12 | callback.Continue(success); 13 | } 14 | else { 15 | callback.Continue(success, userInput); 16 | } 17 | } 18 | 19 | public void Dispose(IJsDialogCallback callback) { 20 | callback.Dispose(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /linux/TweetImpl.CefGlue/Adapters/CefResourceHandlerFactory.cs: -------------------------------------------------------------------------------- 1 | using TweetImpl.CefGlue.Handlers.Resource; 2 | using TweetLib.Browser.CEF.Data; 3 | using TweetLib.Browser.CEF.Interfaces; 4 | using Xilium.CefGlue; 5 | 6 | namespace TweetImpl.CefGlue.Adapters { 7 | sealed class CefResourceHandlerFactory : IResourceHandlerFactory { 8 | public static CefResourceHandlerFactory Instance { get; } = new (); 9 | 10 | private CefResourceHandlerFactory() {} 11 | 12 | public CefResourceHandler CreateResourceHandler(ByteArrayResource resource) { 13 | return new ByteArrayResourceHandler(resource); 14 | } 15 | 16 | public string GetMimeTypeFromExtension(string extension) { 17 | return CefRuntime.GetMimeType(extension); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/fix_dm_input_box_focus.js: -------------------------------------------------------------------------------- 1 | import { $TDX } from "../api/bridge.js"; 2 | import { runAfterFunction } from "../api/patch.js"; 3 | import { TD } from "../api/td.js"; 4 | import { ensurePropertyExists } from "../api/utils.js"; 5 | 6 | function focusDmInput() { 7 | document.querySelector(".js-reply-tweetbox")?.focus(); 8 | } 9 | 10 | /** 11 | * Fixes DM reply input box not getting focused after opening a conversation. 12 | */ 13 | export default function() { 14 | ensurePropertyExists(TD, "components", "ConversationDetailView", "prototype"); 15 | 16 | runAfterFunction(TD.components.ConversationDetailView.prototype, "showChirp", function() { 17 | if ($TDX.focusDmInput) { 18 | setTimeout(focusDmInput, 100); 19 | } 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /lib/TweetLib.Core/Systems/Configuration/BaseConfig.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace TweetLib.Core.Systems.Configuration { 5 | public abstract class BaseConfig : IConfigObject where T : BaseConfig { 6 | public abstract T ConstructWithDefaults(); 7 | 8 | protected void UpdatePropertyWithEvent(ref V field, V value, EventHandler? eventHandler) { 9 | if (!EqualityComparer.Default.Equals(field, value)) { 10 | field = value; 11 | eventHandler?.Invoke(this, EventArgs.Empty); 12 | } 13 | } 14 | 15 | protected void UpdatePropertyWithCallback(ref V field, V value, Action action) { 16 | if (!EqualityComparer.Default.Equals(field, value)) { 17 | field = value; 18 | action(); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/Content/tweetdeck/disable_td_metrics.js: -------------------------------------------------------------------------------- 1 | import { getEvents } from "../api/jquery.js"; 2 | import { onAppReady } from "../api/ready.js"; 3 | import { TD } from "../api/td.js"; 4 | import { checkPropertyExists, noop } from "../api/utils.js"; 5 | 6 | /** 7 | * Disables TweetDeck's metrics. 8 | */ 9 | export default function() { 10 | TD.metrics.inflate = noop; 11 | TD.metrics.inflateMetricTriple = noop; 12 | TD.metrics.log = noop; 13 | TD.metrics.makeKey = noop; 14 | TD.metrics.send = noop; 15 | 16 | onAppReady(function disableMetrics() { 17 | const events = getEvents(window); 18 | 19 | checkPropertyExists(events, "metric"); 20 | checkPropertyExists(events, "metricsFlush"); 21 | 22 | delete events["metric"]; 23 | delete events["metricsFlush"]; 24 | }); 25 | }; 26 | -------------------------------------------------------------------------------- /windows/TweetImpl.CefSharp/Adapters/CefFrameAdapter.cs: -------------------------------------------------------------------------------- 1 | using CefSharp; 2 | using TweetLib.Browser.CEF.Interfaces; 3 | 4 | namespace TweetImpl.CefSharp.Adapters { 5 | sealed class CefFrameAdapter : IFrameAdapter