From decc8338918fd7fb2642c789db3107e781c9a8b8 Mon Sep 17 00:00:00 2001 From: SD SkyKlouD Date: Sun, 23 Jun 2019 03:08:16 +0900 Subject: [PATCH] 20190623 OSS-ize --- .gitattributes | 63 ++ .gitignore | 268 +++++++ .gitmodules | 3 + CHANGELOG.md | 345 +++++++++ .../AssemblyInfoRules-Example.png | Bin 0 -> 18997 bytes DocumentationResources/QCBanner.png | Bin 0 -> 224351 bytes DocumentationResources/QCBanner.svg | 1 + .../VersionRules-Example.png | Bin 0 -> 1925 bytes LICENSE.md | 21 + QuiqCompose-DotNet-Twitter-Text | 1 + QuiqCompose.sln | 49 ++ QuiqCompose/App.config | 30 + QuiqCompose/App.xaml | 23 + QuiqCompose/App.xaml.cs | 35 + QuiqCompose/Classes/ApplicationData.cs | 107 +++ QuiqCompose/Classes/ConfigurationManager.cs | 380 ++++++++++ QuiqCompose/Classes/Helpers/CommandHelper.cs | 182 +++++ .../Classes/Helpers/ImageCacheHelper.cs | 162 ++++ QuiqCompose/Classes/Helpers/JsonHelper.cs | 28 + QuiqCompose/Classes/Helpers/LocalizeHelper.cs | 24 + .../Classes/Helpers/ProcessStartHelper.cs | 20 + .../Security/SecureStringExtensions.cs | 37 + .../Security/StringCryptoExtensions.cs | 81 ++ .../Classes/Helpers/TweetinviHelper.cs | 116 +++ QuiqCompose/Controls/MediaThumbnail.xaml | 105 +++ QuiqCompose/Controls/MediaThumbnail.xaml.cs | 45 ++ .../Controls/MetroWindowBottomControlBar.xaml | 56 ++ .../MetroWindowBottomControlBar.xaml.cs | 44 ++ QuiqCompose/FodyWeavers.xml | 4 + QuiqCompose/FodyWeavers.xsd | 111 +++ QuiqCompose/Properties/AssemblyInfo.cs | 55 ++ QuiqCompose/QuiqCompose-WinDesktop.csproj | 328 ++++++++ QuiqCompose/Resources/Icons/Icon.ico | Bin 0 -> 295912 bytes .../Resources/Icons/QuiqComposeVector.xaml | 19 + .../Resources/OpenSourceLibraries.json | 90 +++ .../Resources/Styles/AppInfoWindowStyles.xaml | 390 ++++++++++ .../Resources/Styles/ComposeWindowStyles.xaml | 713 ++++++++++++++++++ .../Resources/Styles/GlobalStyles.xaml | 171 +++++ .../Styles/SettingsWindowStyles.xaml | 17 + QuiqCompose/Translations/Strings.Designer.cs | 683 +++++++++++++++++ QuiqCompose/Translations/Strings.ja.resx | 341 +++++++++ QuiqCompose/Translations/Strings.ko.resx | 341 +++++++++ QuiqCompose/Translations/Strings.resx | 341 +++++++++ QuiqCompose/Windows/AppInfoWindow.xaml | 130 ++++ QuiqCompose/Windows/AppInfoWindow.xaml.cs | 8 + QuiqCompose/Windows/ComposeSubWindow.xaml | 140 ++++ QuiqCompose/Windows/ComposeSubWindow.xaml.cs | 7 + QuiqCompose/Windows/ComposeWindow.xaml | 98 +++ QuiqCompose/Windows/ComposeWindow.xaml.cs | 34 + .../ComposeButtonContentConverter.cs | 57 ++ .../TwitterAuthMultiValueConverter.cs | 22 + .../TwitterTextLengthProgressBarConverter.cs | 30 + .../DataTypes/AppInfoWindowOpenSourceItems.cs | 41 + .../DataTypes/ComposeSubWindowMediaItem.cs | 62 ++ .../ComposeWindowAccountComboBoxItem.cs | 16 + .../ComboBoxItemTemplateSelectorExtension.cs | 43 ++ .../ComposeWindowAccountComboBoxExtensions.cs | 54 ++ .../ComposeWindowComposeButtonExtensions.cs | 25 + .../MVVM/Extensions/ToolTipExtensions.cs | 29 + .../MVVM/Utilities/MouseWheelGesture.cs | 48 ++ .../MVVM/ViewModels/AppInfoWindowViewModel.cs | 29 + .../ViewModels/ComposeSubWindowViewModel.cs | 109 +++ .../MVVM/ViewModels/ComposeWindowViewModel.cs | 410 ++++++++++ .../ViewModels/PreparationWindowViewModel.cs | 31 + .../ViewModels/SettingsWindowViewModel.cs | 187 +++++ .../ViewModels/TwitterLoginWindowViewModel.cs | 121 +++ QuiqCompose/Windows/PreparationWindow.xaml | 119 +++ QuiqCompose/Windows/PreparationWindow.xaml.cs | 53 ++ QuiqCompose/Windows/PreparationWork.cs | 147 ++++ QuiqCompose/Windows/SettingsWindow.xaml | 139 ++++ QuiqCompose/Windows/SettingsWindow.xaml.cs | 14 + QuiqCompose/Windows/TwitterLoginWindow.xaml | 81 ++ .../Windows/TwitterLoginWindow.xaml.cs | 13 + QuiqCompose/app.manifest | 76 ++ QuiqCompose/packages.config | 21 + README.md | 19 + 76 files changed, 8243 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 CHANGELOG.md create mode 100644 DocumentationResources/AssemblyInfoRules-Example.png create mode 100644 DocumentationResources/QCBanner.png create mode 100644 DocumentationResources/QCBanner.svg create mode 100644 DocumentationResources/VersionRules-Example.png create mode 100644 LICENSE.md create mode 160000 QuiqCompose-DotNet-Twitter-Text create mode 100644 QuiqCompose.sln create mode 100644 QuiqCompose/App.config create mode 100644 QuiqCompose/App.xaml create mode 100644 QuiqCompose/App.xaml.cs create mode 100644 QuiqCompose/Classes/ApplicationData.cs create mode 100644 QuiqCompose/Classes/ConfigurationManager.cs create mode 100644 QuiqCompose/Classes/Helpers/CommandHelper.cs create mode 100644 QuiqCompose/Classes/Helpers/ImageCacheHelper.cs create mode 100644 QuiqCompose/Classes/Helpers/JsonHelper.cs create mode 100644 QuiqCompose/Classes/Helpers/LocalizeHelper.cs create mode 100644 QuiqCompose/Classes/Helpers/ProcessStartHelper.cs create mode 100644 QuiqCompose/Classes/Helpers/Security/SecureStringExtensions.cs create mode 100644 QuiqCompose/Classes/Helpers/Security/StringCryptoExtensions.cs create mode 100644 QuiqCompose/Classes/Helpers/TweetinviHelper.cs create mode 100644 QuiqCompose/Controls/MediaThumbnail.xaml create mode 100644 QuiqCompose/Controls/MediaThumbnail.xaml.cs create mode 100644 QuiqCompose/Controls/MetroWindowBottomControlBar.xaml create mode 100644 QuiqCompose/Controls/MetroWindowBottomControlBar.xaml.cs create mode 100644 QuiqCompose/FodyWeavers.xml create mode 100644 QuiqCompose/FodyWeavers.xsd create mode 100644 QuiqCompose/Properties/AssemblyInfo.cs create mode 100644 QuiqCompose/QuiqCompose-WinDesktop.csproj create mode 100644 QuiqCompose/Resources/Icons/Icon.ico create mode 100644 QuiqCompose/Resources/Icons/QuiqComposeVector.xaml create mode 100644 QuiqCompose/Resources/OpenSourceLibraries.json create mode 100644 QuiqCompose/Resources/Styles/AppInfoWindowStyles.xaml create mode 100644 QuiqCompose/Resources/Styles/ComposeWindowStyles.xaml create mode 100644 QuiqCompose/Resources/Styles/GlobalStyles.xaml create mode 100644 QuiqCompose/Resources/Styles/SettingsWindowStyles.xaml create mode 100644 QuiqCompose/Translations/Strings.Designer.cs create mode 100644 QuiqCompose/Translations/Strings.ja.resx create mode 100644 QuiqCompose/Translations/Strings.ko.resx create mode 100644 QuiqCompose/Translations/Strings.resx create mode 100644 QuiqCompose/Windows/AppInfoWindow.xaml create mode 100644 QuiqCompose/Windows/AppInfoWindow.xaml.cs create mode 100644 QuiqCompose/Windows/ComposeSubWindow.xaml create mode 100644 QuiqCompose/Windows/ComposeSubWindow.xaml.cs create mode 100644 QuiqCompose/Windows/ComposeWindow.xaml create mode 100644 QuiqCompose/Windows/ComposeWindow.xaml.cs create mode 100644 QuiqCompose/Windows/MVVM/Converters/ComposeButtonContentConverter.cs create mode 100644 QuiqCompose/Windows/MVVM/Converters/TwitterAuthMultiValueConverter.cs create mode 100644 QuiqCompose/Windows/MVVM/Converters/TwitterTextLengthProgressBarConverter.cs create mode 100644 QuiqCompose/Windows/MVVM/DataTypes/AppInfoWindowOpenSourceItems.cs create mode 100644 QuiqCompose/Windows/MVVM/DataTypes/ComposeSubWindowMediaItem.cs create mode 100644 QuiqCompose/Windows/MVVM/DataTypes/ComposeWindowAccountComboBoxItem.cs create mode 100644 QuiqCompose/Windows/MVVM/Extensions/ComboBoxItemTemplateSelectorExtension.cs create mode 100644 QuiqCompose/Windows/MVVM/Extensions/ComposeWindowAccountComboBoxExtensions.cs create mode 100644 QuiqCompose/Windows/MVVM/Extensions/ComposeWindowComposeButtonExtensions.cs create mode 100644 QuiqCompose/Windows/MVVM/Extensions/ToolTipExtensions.cs create mode 100644 QuiqCompose/Windows/MVVM/Utilities/MouseWheelGesture.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/AppInfoWindowViewModel.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/ComposeSubWindowViewModel.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/ComposeWindowViewModel.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/PreparationWindowViewModel.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/SettingsWindowViewModel.cs create mode 100644 QuiqCompose/Windows/MVVM/ViewModels/TwitterLoginWindowViewModel.cs create mode 100644 QuiqCompose/Windows/PreparationWindow.xaml create mode 100644 QuiqCompose/Windows/PreparationWindow.xaml.cs create mode 100644 QuiqCompose/Windows/PreparationWork.cs create mode 100644 QuiqCompose/Windows/SettingsWindow.xaml create mode 100644 QuiqCompose/Windows/SettingsWindow.xaml.cs create mode 100644 QuiqCompose/Windows/TwitterLoginWindow.xaml create mode 100644 QuiqCompose/Windows/TwitterLoginWindow.xaml.cs create mode 100644 QuiqCompose/app.manifest create mode 100644 QuiqCompose/packages.config create mode 100644 README.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ef2b12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,268 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Zeta Resource Editor project file +*.zreproj + +# Windows files +desktop.ini +Thumbs.db diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c22dd88 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "QuiqCompose-DotNet-Twitter-Text"] + path = QuiqCompose-DotNet-Twitter-Text + url = https://github.com/SDSkyKlouD/QuiqCompose-DotNet-Twitter-Text diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..90d78aa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,345 @@ +# 변경 사항 +QuiqCompose의 업데이트마다 작성되는 변경 사항들입니다. 최신 버전은 위에, 이전 버전일수록 아래에 기재됩니다. + +
+ +20190623 (OSS 릴리즈) +--------------------- + + SD꽁치 개인 서버의 API와 관련된 모든 코드/기능 삭제 + + 트윗 개수 전송 + + 업데이트 확인 기능 + + 업데이트 확인 창 + + 준비 과정 중 업데이트 확인 + + 그 외 API와 관련된 변수/상수/클래스/메서드 등 삭제 + + 프로그램 구동에 필요한 전역 변수/상수의 선언 방식 변경 + + 중국어 번역 삭제 (불완전) + + 어셈블리 정보 일부 변경 + + 종속 라이브러리 업데이트 + + 프로그램 정보 창에서 링크 버튼 일부 교체 + + 트위터, 트위터 (일본 계정), QuiqCompose 홈페이지, 페이팔 기부 → 트위터, GitHub 리포지토리 + +
+ +버전 0.10.2 +----------- +> 2018년 12월 18일 빌드 및 배포 + +#### 추가 + + 작성 보조 창에서 미디어 항목 열기(줌) 가능 + + 설정 창에서 작성 창 및 작성 보조 창의 투명도 설정 가능 + +#### 수정 + + 프로그램 정보 창 - 오픈 소스 라이브러리 탭에서 Costura.Fody의 라이선스 추가 (실수로 추가하지 않았었음) + +
+ +버전 0.10.1 +----------- +> 2018년 10월 10일 빌드 및 배포 + +#### 수정 + + 작성 보조 창이 조금 더 늦게 나타나도록 수정 + + 계정 닉네임이 3글자 이하인 경우 계정 추가가 안되던 문제 수정 + + 트위터 [별 (@ASTERISK_twit)](https://twitter.com/ASTERISK_twit)님의 제보 + + 인증된 계정이 없을 때, 설정에서 언어 변경 시 작성 창 텍스트박스의 힌트가 계정 추가 안내 내용이 아닌 무작위 내용으로 설정되던 문제 수정 + + 인증된 계정이 없을 때, 작성 창 텍스트박스가 비활성화되도록 수정 + +#### 제거 + + 계정 추가 창에서 이미 인증되어 추가된 계정을 추가하려고 할 때, 더 이상 이미 있는 계정 정보를 업데이트하지 않음 + +
+ +버전 0.10.0 +----------- +> 2018년 10월 04일 빌드 및 배포 + +#### 추가 + + **미디어 첨부 기능 추가** + + 작성 창 아래에 보조 창이 표시되며, 보조 창에서 미디어를 추가/제거할 수 있음 + + 현재로서는 정적 이미지 포맷인 *PNG, JPG, WebP*만 지원 + + 추가된 계정이 없을 경우 UI 피드백 + + 작성 버튼이 비활성화되고, 글 영역에 힌트로 간단한 계정 추가 도움말 표시 + + 프로그램 정보 창의 일부 링크 버튼들에 URL을 툴팁으로 표시 + +#### 수정 + + 프로그램 네임스페이스를 알맞게 수정 + + 프로그램 업데이트를 비동기적으로 확인 + + 로딩 작업 중, 등록된 계정이 없을 경우 계정 정보 업데이트 작업 건너뛰기 + +
+ +버전 0.9.0 +---------- +> 2018년 08월 19일 빌드 및 배포 + +#### 추가 + + 계정 삭제 기능 추가 + + 계정 목록에서 프로필 아이콘을 눌러 삭제 가능 + + 프로그램 정보 창에 PayPal 기부 버튼 추가 + + 프로그램 정보 창에 사용된 오픈 소스 라이브러리 목록 추가 + +#### 수정 + + 작성 창에서 현재 계정은 프로필 아이콘으로만 표시 (닉네임 및 아이디 표시 제거) + + 프로그램 정보 창을 설정 창과 같은 스타일로 변경 및 레이아웃, 버튼 스타일 변경 + + 프로그램 언어 변경 시 작성 창의 힌트 문구의 언어가 바로 반영이 되지 않던 문제 수정 + +
+ +버전 0.8.1 +---------- +> 2018년 07월 24일 빌드 및 배포 + +#### 수정 + + 프로그램 첫 실행(이전에 프로그램을 사용한 적이 없을) 시, 설정 파일이 만들어지지 않고 계정 추가 시 크래시나는 문제 수정 + + 프로그램 아이콘에 그림자 제거 (이전 아이콘 재사용) + +
+ +버전 0.8.0 +---------- +> 2018년 06월 27일 빌드 및 배포 + +### 전역 +#### 추가 + + 중국어(간체) 추가 (기본적인 단어들만 번역) + +#### 수정/개선 + + CJK 언어에서의 폰트 선호 순서 지정 + + > Segoe UI (라틴 문자) → Yu Gothic (Windows 10, 일본어 가나/칸지) → Meiryo (Windows 8.1 이하, 일본어 가나/칸지) → Microsoft YaHei (중국어 간체) → 맑은 고딕 (한국어) + + + 트위터 앱 토큰 및 계정 접근 토큰은 내부적으로 보안 문자열(SecureString)로 처리 + +### 준비(로딩) 및 로딩 창 관련 +#### 추가 + + 창이 열릴 때 상태 텍스트에 약간의 애니메이션 추가 + +#### 수정/개선 + + 인터넷에 연결되어있음에도 불구하고 인터넷 연결 확인 시 오류가 발생(타임아웃)하는 문제 수정 + + > 인터넷 연결 확인 소스를 `clients3.google.com`에서 `www.gstatic.com`으로 변경 + + + 계정 정보 업데이트 후 설정 파일에 변경 사항을 업데이트하지 않던 문제 수정 + + 프로그램 첫 실행 시 로딩 과정에서 "잘못된 설정 파일" 오류 메시지가 표시되는 문제 수정 (설정 파일이 존재하지 않을 경우 자동으로 설정 파일 생성) + +### 프로그램 설정 및 설정 창 관련 +#### 추가 + + 언어 선택 드롭다운에 각 언어의 영어 이름 표시 + + 마지막으로 선택한 계정 위치를 기억하는 설정 추가 + +#### 수정/개선 + + 설정 초기화 후 언어 기본값이 잘못 설정되어있는 문제 수정 + + 계정 접근 토큰을 암호화하여 설정 파일에 저장 + + 기존 버전에서 업데이트 시 자동으로 토큰이 암호화되어 저장됨 (계정 재인증 또는 설정 초기화 필요 없음) + +### 트위터 계정 추가 및 계정 추가 창 관련 +#### 추가 + + 계정 인증 페이지 다시 열기 기능 추가 + +#### 수정/개선 + + 설정 창의 모습과 비슷하게 리디자인 + +
+ +버전 0.7.0 +---------- +> 2018년 06월 04일 빌드 및 배포 + +#### 추가 + + 작성 버튼 클릭 시 전송 중/완료/실패 여부를 시각적으로 피드백 + + 프로그램 로딩 창 리디자인 + + 보다 빠른 초기 실행을 위해 MahApps.Metro에서 제공하는 MetroWindow를 사용하지 않고 일반 Window 사용 + + ProgressRing 제거, 애니메이션이 있는 데코레이션용 도트 추가 + + 설정 창 리디자인 + + 설정 초기화 기능 추가 + +#### 수정 + + 트윗 전송을 비동기적으로 처리 + + 설정 창의 스크롤바를 (필요가 없으면) 안보이게 설정 + + 프로그램 로딩 완료 후 작성 창을 열 때, 작성 창이 프로그램 로딩 창 중앙에서 열리도록 위치 설정 + + 프로그램 정보 창에 사용되는 QuiqCompose 아이콘을 벡터 이미지로 교체 + +
+ +버전 0.6.0 +---------- +> 2018년 05월 30일 빌드, 31일 배포 + +#### 추가/수정 + + 작성 창 + + 작성 텍스트박스의 크기 조절 하한 추가 + + 프로그램 로딩 후 자동으로 작성 텍스트박스로 포커스 + + > 마우스 조작 없이 바로 트윗 작성 가능 + + + 프로그램 로딩 + + 프로그램 로딩 시 인터넷 연결 확인에 타임아웃(10초) 설정 + + 프로그램 로딩 시 설정 파일이 유효하지 않으면 설정 파일 재생성 여부를 물어봄 + + 설정 관련 + + 설정 관리 클래스 재작성 + + 트윗 작성 개수 전송 설정을 영구히 활성화 + + 설정 창의 변경 사항이 생기면 바로 설정 파일로 저장 + + 외관 + + 프로그램 아이콘에 그림자 추가 + +
+ +버전 0.5.1 +---------- +> 2018년 05월 26일 빌드 및 배포 + +#### 수정 + + 버전 0.5.0 이전 버전에서 버전 0.5.0으로 업데이트한 후, 설정을 읽어들이지 못하고 계정 추가 시 크래시가 발생하는 버그 수정 + + 트위터 [Pis (@\_PPis\_)](https://twitter.com/_PPis_)님의 제보 + + 원활한 크래시 및 버그 분석을 위해 디버그 데이터베이스(pdb)를 프로그램에 포함 + +
+ +버전 0.5.0 +---------- +> 2018년 05월 23일 빌드 및 배포 + +#### 추가 + + 작성 창 + + 텍스트 길이 표시 진행바에 값 변경 애니메이션 추가 + + 텍스트 입력란의 힌트 문장 4개 추가, 랜덤하게 변경 + + 트윗 작성 개수를 서버로 전송 + + 설정 - 개인 정보 탭에서 전송 여부를 켜고 끌 수 있음 + + 설정 파일 + + 프로그램 버전 속성 추가 + +#### 수정 + + 업데이트 확인(발견) 창 + + UI 배치 일부 수정 + + 트위터 계정 PIN 인증 창 + + 버튼 스타일 변경 + + PIN 입력 중 엔터 키를 눌러 인증 진행 가능 + + 네임스페이스 변경 + + `QuiqComposeWinDesktop` → `SDSK.QuiqCompose.WinDesktop` + +#### 참고사항 +"트윗 작성 개수를 서버로 전송"하는 기능은 서버로 트윗 작성 개수**만** 암호화된 프로토콜(HTTPS)로 전송하는 기능임. +이 작성 개수 정보는 분석 용도 혹은 웹사이트에서의 표시 용도로만 사용될 예정임. +이 외의 개인 정보 등이 수집되는 일이 **전혀** 없으므로 해당 설정을 켜 둘 것을 권장. + +
+ +버전 0.4.1 +---------- +> 2018년 05월 20일 빌드 및 배포 + +#### 추가 + + 프로그램 정보 창에 간단한 내용 추가 + + 프로그램 버전 + + 개발자 트위터/홈페이지 링크 + +
+ +버전 0.4.0 +---------- +> 2018년 05월 20일 빌드 + +#### 추가 + + 직접 포팅한 [twitter-text](https://github.com/twitter/twitter-text) 라이브러리 사용, 더 정확한 텍스트 길이 측정 + + 프로그램 실행 준비 시 계정 정보 업데이트 + + 언어 변경 기능 추가 + + 설정 창에서 변경 가능 + +#### 수정 + + 수정된 최신 버전 확인 API 로직에 대응 + + > 참고 : 이전 QuiqCompose 버전에서 업데이트 확인 기능 사용 불가 + + + 웹 브라우저를 실행할 수 없는 환경(ex. 학교 등 공공 컴퓨터에 설치된 마에스트로 클라이언트 등으로 인해 실행 방지된 경우)에서 발생하는 크래시(강제 종료) 수정 + + 크래시가 발생해도 프로그램이 강제 종료되지 않고, 대신에 URL을 클립보드로 복사 + +#### 제거 + + 작성 창의 프리뷰 버전 텍스트 제거 + +
+ +버전 0.3.1 +---------- +> 2018년 05월 12일 빌드 및 배포 + +#### 수정 + + 서버 이전 및 `sdsk.app` 도메인 구매에 의한 웹 구조 변경에 따라, 업데이트 확인 주소 변경 + + > 참고 : 이전 QuiqCompose 버전에서 업데이트 확인 기능 사용 불가 + +
+ +버전 0.3.0 +---------- +> 2018년 05월 05일 빌드 및 배포 + +#### 추가 + + 설정 창 사용 가능 + + 현재까지 구현된 설정들 + + 창 항상 위로 + + 프로그램 실행 시 업데이트 확인 + + 계정을 눌러 프로필 페이지 열기 + + 프로필 이미지 표시 + + 작성 창에 프로필 이미지 표시 + + 작성 창으로 넘어가기 전에 프로그램 사용에 필요한 사항 체크 + + 인터넷 연결 확인 (인터넷 연결이 확인되지 않으면 프로그램 종료) + + 설정 파일 불러오기 + + 업데이트 확인 + +#### 수정 + + 이미 인증(로그인)된 계정으로 다시 인증하게 되면 프로필 정보를 업데이트하여 설정에 저장 + +#### 파악된 문제점 + + 프로필 이미지가 표시되기 위해선 계정을 재인증(다시 로그인)하고 프로그램을 재시작해야 함 + +
+ +버전 0.2.2 +---------- +> 2018년 04월 30일 빌드 및 배포 + +#### 수정 + + 인터넷 연결이 없을 때 QuiqCompose가 실행되지 않던 문제 수정 + +
+ +버전 0.2.1 +---------- +> 2018년 04월 23일 빌드 및 배포 + +#### 추가 + + 작성 창에서 계정 부분을 클릭하면 웹 브라우저에서 사용자 SNS 프로필 페이지를 염 + + 업데이트 발견 창에 배포(빌드) 일자 텍스트 추가 + +
+ +버전 0.2.0 +---------- +> 2018년 04월 20일 빌드 및 배포 + +#### 추가 + + Ctrl+마우스 휠로 작성 텍스트의 글꼴 크기 조절 + + 마지막으로 조절된 글꼴 크기를 설정에 저장, 프로그램 시작 시 설정을 불러와 적용 + + 버튼들에 툴팁(ToolTip) 추가 + + 작성 텍스트에 툴팁으로 단축키 설명 추가 + + 설정 창 및 프로그램(애플리케이션) 정보 창 생성 (생성만 해놓음) + + `api.sdsk.one`과 연동하여 QuiqCompose의 최신 버전 체크 기능 추가, 다운로드/변경 사항 보기 버튼 클릭 시 브라우저로 URL 열기 + +#### 수정 + + 작성한 텍스트의 길이가 280바이트 이상일 때 트윗 게시 방지 + +
+ +버전 0.1.0 +---------- +> 2018년 04월 18일 빌드 및 배포 + +개발 시작 이후 처음으로 릴리즈하는 프리뷰 버전입니다. + +#### 추가 + + 트위터 트윗 작성을 위한 기본적인 기능 (계정 인증, 작성 등) + + UI 라이브러리로 [MahApps.Metro](https://github.com/MahApps/MahApps.Metro) 사용 + + 설정 파일(XML)을 통해 계정 정보 저장 및 불러오기 + + 다중 계정 지원 + + 3개국어 지원 (한국어, 영어, 일본어) + + 기타 등등 아무튼 기본적인 기능들 diff --git a/DocumentationResources/AssemblyInfoRules-Example.png b/DocumentationResources/AssemblyInfoRules-Example.png new file mode 100644 index 0000000000000000000000000000000000000000..700f7c29034d7476665a2656a827d15ca4dd3242 GIT binary patch literal 18997 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 JyJPt5{{Z$4GsOS^ literal 0 HcmV?d00001 diff --git a/DocumentationResources/QCBanner.svg b/DocumentationResources/QCBanner.svg new file mode 100644 index 0000000..9e2b38d --- /dev/null +++ b/DocumentationResources/QCBanner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/DocumentationResources/VersionRules-Example.png b/DocumentationResources/VersionRules-Example.png new file mode 100644 index 0000000000000000000000000000000000000000..52e5390d02b06f1affa7f2b56a4ee01a6171ee3d GIT binary patch literal 1925 zcmbW&X;hO}8VB$fOi2Q=1SIf6Kp+8;YJ>z7Bte!Kh+;4dEzC%TAThECVbLUlOGDV& zNC>hNSqcV3Dg?9?0ToEF4GpL;R&5nof+!MYF*+;_(zKnK(>bR-?U@hv-v4vX{q{V+ zd-L~G0}b`9^Z@`cqy&*d0YHbY%>gi7?Jg@o!?lM_T41<06?uMB)>4u!B9)-WlC>$d|S~B`3_3BrHyv0f52|4FDd62;huWe;zlp$E9go zmaqk?8W^8cNmp=7OD9^p4P$Q+rp0R+#A17l$w)TaLLm4IiW+$jW_#B3Pvb~2V)3!O zY-10Xb|yY)Q7x?I%qA&&T9=U@jE`e|=Z_SRLqWejSwCe*;Pj$!Tk5&^mx6wFUK9G* zr1j^h@N)L9;f9zhTafKJCmQ1&U;l$h^9jnc!@z`K<=9b*NW~U`Zct^uz_qa;!t#iH zedy(oue(^arnau<>*gG$X%^to4GNQ`KseGmkR8mTvu=Xy3bBD`7@qp3wsd8dM`Dn%8LIcwlQGx&M`c$;HmJA@kKKk%-q@58RuywMe&|50mu?$3 zMR8jML7BFKyJ$M9N_EJGbLJK*`&=&SLw`Gg2rjn*iy9ZdGa`!_i#P72B9}agRsx z%V^jsowD(M|9XLGOnd%DZ zIkT7bv>C^%S&n|%d%o{O)H~UwO|kbrm`0wsA4qiZ@%p0Kpzmbr$CUc-N?!!K#L+Uo zl$j`??;o8=bA?=+G|RjiI#Xb(u|p>|(Ff#Av~`7SUiCar|Jf5_gvBFJWI9$(+qX~H ztiG9p3%KA80VmRRZyx-Y&GX}~kR6j7GJRu22;w<%VP8+ zS6qxOi)CTQao_W&krhBDXux3}Gu}+IOVhP1j}3tu&FVsgWH^>VnqVq&r+zexwqaNWyiN=%OjumRi%m93 zq;>LY3G#VS_?{;;o;5xuFgSVyql7(x7M=faNNw{)WB8HH!Xk_b?mmTYmH4=8n03K^ z+8fJVDH-E_nW7aN)$8c_S^}mFn)gTsSMk&K$b?Df!yyrs4V0->C&?p;mzOcN5K(T3 zT#-%v28qTQ&B;T7B5GYt<)&{rW-(PL@E&TmeMf0Y=;6_7%BN1RzcI=gw_w2wwuC91 zrK>nu-NDPb5lsf_qlIDrbQqNkP3nSl0(_II{J+}E1T_mTtm_ufx;YdNwEI_r*5t}C zCw1~$yCc`P#9@91Pvpsh*3C@5hv@7Q-eGqRzj<1aHzW}&6_?V29DQ3f0r7Ukto^^`B=yDJKLT_K^c4r2EU+6!EET$_C z-Hicbh#@;U#9v-%d$ce5uTI(@kK&u*D6@ZqV9YPPjsDfi*zZ74WS)ArZh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/App.xaml b/QuiqCompose/App.xaml new file mode 100644 index 0000000..0669fb0 --- /dev/null +++ b/QuiqCompose/App.xaml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/App.xaml.cs b/QuiqCompose/App.xaml.cs new file mode 100644 index 0000000..39db4ae --- /dev/null +++ b/QuiqCompose/App.xaml.cs @@ -0,0 +1,35 @@ +using System.Threading; +using System.Windows; +using SDSK.QuiqCompose.WinDesktop.Classes; +using SDSK.QuiqCompose.WinDesktop.Classes.Helpers; +using SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security; + +namespace SDSK.QuiqCompose.WinDesktop { + public partial class App : Application { + public App() { + Tweetinvi.TweetinviConfig.ApplicationSettings.TweetMode = Tweetinvi.TweetMode.Extended; + Tweetinvi.TweetinviConfig.CurrentThreadSettings.InitialiseFrom(Tweetinvi.TweetinviConfig.ApplicationSettings); + + LocalizeHelper.SetCurrentUICulture(Thread.CurrentThread.CurrentUICulture); + + /* You MUST set instance of ApplicationData to make the application work. + * + * Example : + * ApplicationData.SetInstance(new ApplicationData() { + * AppVersion = "yyyyMMdd", + * AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"QuiqCompose"), + * ConfigurationFileRelativePath = null, + * ConfigurationFileName = @"Settings.xml", + * ImageCacheFolderRelativePath = @"Caches/Images", + * CryptoSalt = @"QC_SALT".ToSecureString(), + * TwitterApp = new TwitterAppInfo() { + * ConsumerKey = "~~~~".ToSecureString(), + * ConsumerSecretKey = "~~~~".ToSecureString() + * } + * }); + * + * NOTE that at least `TwitterApp` property MUST be set (another properties has preset but `TwiterApp` doesn't) + */ + } + } +} diff --git a/QuiqCompose/Classes/ApplicationData.cs b/QuiqCompose/Classes/ApplicationData.cs new file mode 100644 index 0000000..3a5a2b4 --- /dev/null +++ b/QuiqCompose/Classes/ApplicationData.cs @@ -0,0 +1,107 @@ +using System; +using System.IO; +using System.Security; +using SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security; +using Tweetinvi.Models; + +namespace SDSK.QuiqCompose.WinDesktop.Classes { + /// + /// A class stores various data to make the application work. + /// Use `ApplicationData.Instance` when you have to access these data. + /// + internal class ApplicationData { + /// + /// A static instance of ApplicationData + /// + internal static ApplicationData Instance { get; private set; } + + /// + /// Name of the application + /// + internal string AppName { get; } = "QuiqCompose"; + /// + /// Version of the application + /// + internal string AppVersion { get; set; } = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).FileVersion; + /// + /// Absolute path where the files and folders related to the application goes + /// + internal string AppDataPath { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"QuiqCompose"); + /// + /// Root path of the configuration file, relative to AppDataPath + /// + internal string ConfigurationFileRelativePath { get; set; } = null; + /// + /// File name of the configuration file + /// + internal string ConfigurationFileName { get; set; } = @"Settings.xml"; + /// + /// Root path for storing cached images. relative to AppDataPath + /// + internal string ImageCacheFolderRelativePath { get; set; } = @"Caches\Images"; + /// + /// Salt string used when encrypt/decrypt Twitter user auth tokens + /// + internal SecureString CryptoSalt { get; set; } = @"QC_SALT".ToSecureString(); + /// + /// Twitter application information + /// + internal TwitterAppInfo TwitterApp { get; set; } = null; + + /// + /// Set static instance of ApplicationData + /// + /// An ApplicationData instance + /// + internal static void SetInstance(ApplicationData instance) { + if(instance != null && instance is ApplicationData) { + Instance = instance; + } else { + throw new ArgumentNullException(nameof(instance)); + } + } + /// + /// Get absolute path of the folder where the configuration file saved + /// + /// + internal string GetConfigurationFileRootFolderAbsolutePath() => Path.Combine(AppDataPath, ConfigurationFileRelativePath ?? ""); + /// + /// Get absolute path of the configuration file + /// + internal string GetConfigurationFileAbsolutePath() => Path.Combine(AppDataPath, ConfigurationFileRelativePath ?? "", ConfigurationFileName); + /// + /// Get absolute path of image cache folder + /// + internal string GetImageCacheFolderAbsolutePath() => Path.Combine(AppDataPath, ImageCacheFolderRelativePath ?? ""); + } + + /// + /// A class stores Twitter application information + /// + internal class TwitterAppInfo { + private SecureString _consumerKey = null; + internal SecureString ConsumerKey { + get { + if(_consumerKey != null) { + return _consumerKey; + } else { + throw new InvalidOperationException("ConsumerKey is not set but tried to access it"); + } + } + set => _consumerKey = value; + } + private SecureString _consumerSecretKey = null; + internal SecureString ConsumerSecretKey { + get { + if(_consumerSecretKey != null) { + return _consumerSecretKey; + } else { + throw new InvalidOperationException("ConsumerSecretKey is not set but tried to access it"); + } + } + set => _consumerSecretKey = value; + } + + internal TwitterCredentials GetTwitterCredentials() => new TwitterCredentials(ConsumerKey.ReadAsString(), ConsumerSecretKey.ReadAsString()); + } +} diff --git a/QuiqCompose/Classes/ConfigurationManager.cs b/QuiqCompose/Classes/ConfigurationManager.cs new file mode 100644 index 0000000..9fe4a3b --- /dev/null +++ b/QuiqCompose/Classes/ConfigurationManager.cs @@ -0,0 +1,380 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.Security; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; +using SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security; + +namespace SDSK.QuiqCompose.WinDesktop.Classes { + /// + /// Application configuration management class + /// 프로그램 설정 관리 클래스 + /// + internal static class ConfigurationManager { + internal static ConfigurationsRoot ConfigurationInstance { get; private set; } = null; + internal static readonly XmlSerializer Serializer = new XmlSerializer(typeof(ConfigurationsRoot)); + internal static bool IsConfigurationLoaded { get; private set; } = false; + + /// + /// Load the configurations from pre-defined configuration file path. + /// After load, the configurations can be accessed via ConfigurationManager.ConfigurationInstance. + /// 미리 지정된 설정 파일 경로에서 설정 파일을 불러들입니다. + /// 설정이 불러들여지면, ConfigurationManager.ConfigurationInstance를 통해 설정에 접근할 수 있습니다. + /// + /// + /// `true` if the configuration loaded successfully. + /// 설정 파일이 성공적으로 불러들여진 경우 `true`를 반환합니다. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + internal static bool Load() { + IsConfigurationLoaded = false; + + /* Step 1. Create configuration directory tree if not exists */ + CreateConfigurationDirectory(); + + /* Step 2. Throw an exception when invalid configuration file found */ + if(Directory.Exists(ApplicationData.Instance.GetConfigurationFileRootFolderAbsolutePath())) { + if(File.Exists(ApplicationData.Instance.GetConfigurationFileAbsolutePath())) { + using(FileStream confFileStream = new FileStream(ApplicationData.Instance.GetConfigurationFileAbsolutePath(), FileMode.Open, FileAccess.Read, FileShare.None)) { + if(((new FileInfo(ApplicationData.Instance.GetConfigurationFileAbsolutePath())).Length < 500) + || (!Serializer.CanDeserialize(new XmlTextReader(confFileStream)))) { + throw new ConfigurationInvalidException("The configuration file isn't deserializable."); + } + } + } + } + + /* Step 3. Deserialize configuration file */ + if(Directory.Exists(ApplicationData.Instance.GetConfigurationFileRootFolderAbsolutePath()) && File.Exists(ApplicationData.Instance.GetConfigurationFileAbsolutePath())) { + using(FileStream confFileStream = new FileStream(ApplicationData.Instance.GetConfigurationFileAbsolutePath(), FileMode.Open, FileAccess.Read, FileShare.None)) { + using(XmlTextReader reader = new XmlTextReader(confFileStream)) { + if(Serializer.CanDeserialize(reader)) { + try { + ConfigurationInstance = (ConfigurationsRoot) Serializer.Deserialize(reader); + } catch(InvalidOperationException e) { + throw new ConfigurationInvalidException("An exception thrown during deserializing configurations.", e); + } + } else { + throw new ConfigurationInvalidException("The configuration file can't be deserialized."); + } + } + } + } + + /* Step 4. Check deserialized configuration instance */ + if(ConfigurationInstance != null + && !string.IsNullOrWhiteSpace(ConfigurationInstance.AppVersion) + && new Regex(@"\d+\.\d+\.\d+\.\d+").IsMatch(ConfigurationInstance.AppVersion) + && ConfigurationInstance.AccountInformations != null + && ConfigurationInstance.UIConfigurations != null) { + IsConfigurationLoaded = true; + return true; + } else { + throw new ConfigurationInvalidException("Checking for deserialized configuration was failed."); + } + } + + /// + /// Load the configuration from pre-defined configuration file path, in asynchronous way. + /// 미리 지정된 설정 파일 경로에서 설정 파일을 비동기적으로 불러들입니다. + /// + /// + /// `true` if the configuration loaded successfully. + /// 설정 파일이 성공적으로 불러들여진 경우 `true`를 반환합니다. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + internal static Task LoadAsync() + => Task.Run(() => Load()); + + /// + /// Save the configurations to pre-defined configuration file path. + /// 미리 지정된 설정 파일 경로로 설정을 저장합니다. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + internal static void Save() { + using(FileStream confFileStream = new FileStream(ApplicationData.Instance.GetConfigurationFileAbsolutePath(), FileMode.Create, FileAccess.Write, FileShare.None)) { + if(IsConfigurationReady()) { + ConfigurationInstance.AppVersion = ApplicationData.Instance.AppVersion; + } + + using(XmlTextWriter writer = new XmlTextWriter(confFileStream, System.Text.Encoding.Unicode)) { + writer.Formatting = Formatting.Indented; + + Serializer.Serialize(writer, ConfigurationInstance); + } + } + } + + /// + /// Save the configurations to pre-defined configuration file path, in asynchronous way. + /// 미리 지정된 설정 파일 경로로 설정을 비동기적으로 저장합니다. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + internal static Task SaveAsync() + => Task.Run(() => Save()); + + internal static void CreateEmptyConfiguration() { + ConfigurationInstance = new ConfigurationsRoot(); + Save(); + } + + internal static bool IsConfigurationReady() + => ConfigurationInstance != null && + ConfigurationInstance.AccountInformations != null && + ConfigurationInstance.UIConfigurations != null && + IsConfigurationLoaded; + + internal static bool CreateConfigurationDirectory() { + Directory.CreateDirectory(ApplicationData.Instance.GetConfigurationFileRootFolderAbsolutePath()); + + if(!Directory.Exists(ApplicationData.Instance.GetConfigurationFileRootFolderAbsolutePath()) && !((new DirectoryInfo(ApplicationData.Instance.GetConfigurationFileRootFolderAbsolutePath())).Attributes.HasFlag(FileAttributes.ReadOnly))) { + return true; + } + + return false; + } + } + + #region Configuration classes + [XmlRoot(ElementName = "Configurations", IsNullable = false)] + public class ConfigurationsRoot { + public string AppVersion { get; set; } = ApplicationData.Instance.AppVersion; + [XmlArray(), XmlArrayItem(Type = typeof(CTwitterAccountInformation), ElementName = "TwitterAccountInfo")] + public List AccountInformations { get; set; } = new List(); + public CUserInterfaceSettings UIConfigurations { get; set; } = new CUserInterfaceSettings(); + + #region Functions + public CTwitterAccountInformation FindAccountById(long accountId) { + CTwitterAccountInformation item = null; + + AccountInformations.ForEach(i => { + if(i.AccountID == accountId) { + item = i; + } + }); + + return item; + } + + public int AccountCount() + => AccountInformations.Count; + + public void UpdateAccountInformation(long accountId, string nickname = null, + string screenname = null, string profileImageUrl = null) { + if(FindAccountById(accountId) is CTwitterAccountInformation account) { + if(!account.Nickname.Equals(nickname) || !account.ScreenName.Equals(screenname) || !account.ProfileImageUrl.Equals(profileImageUrl)) { + var tempDecryptedAccessTokens = DecryptAccessTokens(account); + var refreshedAccount = new CTwitterAccountInformation() { + AccountID = accountId, + Nickname = nickname, + ScreenName = screenname, + ProfileImageUrl = profileImageUrl, + TokenInfo = new CTwitterAccountTokenInformation() { + AccessToken = tempDecryptedAccessTokens.Item1.ReadAsString(), + AccessTokenSecret = tempDecryptedAccessTokens.Item2.ReadAsString() + } + }; + EncryptAccessTokens(refreshedAccount); + ReplaceAccount(accountId, refreshedAccount); + } else { + account.Nickname = nickname; + account.ScreenName = screenname; + account.ProfileImageUrl = profileImageUrl; + } + } + } + + public bool ReplaceAccount(long accountId, CTwitterAccountInformation accountInformation) { + int currentIndex = GetAccountIndex(accountId); + + if(currentIndex != -1) { + RemoveAccount(accountId); + AddAccount(currentIndex, accountInformation); + + if(AccountInformations[currentIndex] == accountInformation) { + return true; + } + } + + return false; + } + + public int GetAccountIndex(long accountId) { + int index = -1; + + AccountInformations.ForEach(i => { + if(i.AccountID == accountId) { + index = AccountInformations.IndexOf(i); + } + }); + + return index; + } + public int GetAccountIndex(CTwitterAccountInformation accountInformation) + => AccountInformations.IndexOf(accountInformation); + + public void AddAccount(CTwitterAccountInformation accountInformation) + => AddAccount(AccountInformations.Count, accountInformation); + public void AddAccount(int index, CTwitterAccountInformation accountInformation) { + if(!accountInformation.TokenInfo.Secured) { + EncryptAccessTokens(accountInformation); + } + + AccountInformations.Insert(index, accountInformation); + } + + public void RemoveAccount(long accountId) + => AccountInformations.Remove(FindAccountById(accountId)); + public void RemoveAccount(CTwitterAccountInformation accountInformation) + => AccountInformations.Remove(accountInformation); + + internal Tuple DecryptAccessTokens(long accountId) + => DecryptAccessTokens(FindAccountById(accountId)); + internal Tuple DecryptAccessTokens(CTwitterAccountInformation accountInformation) { + if(accountInformation.TokenInfo.Secured) { + return new Tuple( + accountInformation.TokenInfo.AccessToken.Decrypt( + accountInformation.GetPW(accountInformation.Nickname.Substring( + accountInformation.Nickname.Length - 1 - (accountInformation.Nickname.Length < 4 ? 0 : 1), 1)).ReadAsString(), + accountInformation.GetSALT(nameof(accountInformation.TokenInfo.AccessToken)).ReadAsString(), + accountInformation.GetIV(@"CoLA").ReadAsString()), + accountInformation.TokenInfo.AccessTokenSecret.Decrypt( + accountInformation.GetPW(accountInformation.Nickname.Substring( + accountInformation.Nickname.Length - 1 - (accountInformation.Nickname.Length < 4 ? 0 : 3), 1)).ReadAsString(), + accountInformation.GetSALT(nameof(accountInformation.TokenInfo.AccessTokenSecret)).ReadAsString(), + accountInformation.GetIV(@"CH!K").ReadAsString())); + } else { + return new Tuple( + accountInformation.TokenInfo.AccessToken.ToSecureString(), + accountInformation.TokenInfo.AccessTokenSecret.ToSecureString()); + } + } + + internal void EncryptAccessTokens(long accountId) + => EncryptAccessTokens(FindAccountById(accountId)); + internal void EncryptAccessTokens(CTwitterAccountInformation accountInformation) { + if(!accountInformation.TokenInfo.Secured) { + accountInformation.TokenInfo.AccessToken + = accountInformation.TokenInfo.AccessToken.Encrypt( + accountInformation.GetPW(accountInformation.Nickname.Substring( + accountInformation.Nickname.Length - 1 - (accountInformation.Nickname.Length < 4 ? 0 : 1), 1)).ReadAsString(), + accountInformation.GetSALT(nameof(accountInformation.TokenInfo.AccessToken)).ReadAsString(), + accountInformation.GetIV(@"CoLA").ReadAsString()).ReadAsString(); + accountInformation.TokenInfo.AccessTokenSecret + = accountInformation.TokenInfo.AccessTokenSecret.Encrypt( + accountInformation.GetPW(accountInformation.Nickname.Substring( + accountInformation.Nickname.Length - 1 - (accountInformation.Nickname.Length < 4 ? 0 : 3), 1)).ReadAsString(), + accountInformation.GetSALT(nameof(accountInformation.TokenInfo.AccessTokenSecret)).ReadAsString(), + accountInformation.GetIV(@"CH!K").ReadAsString()).ReadAsString(); + + accountInformation.TokenInfo.Secured = true; + } + } + #endregion + } + + [XmlRoot(IsNullable = false)] + public class CTwitterAccountInformation { + [XmlAttribute()] + public long AccountID { get; set; } + public string Nickname { get; set; } + public string ScreenName { get; set; } + public string ProfileImageUrl { get; set; } + public CTwitterAccountTokenInformation TokenInfo { get; set; } + + #region Security functions + internal SecureString GetPW(string additional = "") + => $"ACC_MIKU_TOKPW!{ScreenName}SDSK{additional}QC{AccountID}".ToSecureString(); + internal SecureString GetSALT(string additional = "") + => $"QuIqCoMpOsE!@!{new string("CoNfIgUrAtIoN".ToCharArray().Select(c => (char) (c << 1)).ToArray())}*&*SaLT^#^{additional}".ToSecureString(); + internal SecureString GetIV(string specified4B = "QC39") + => ($"{ScreenName.Substring(0, 2)}{ScreenName.Substring(ScreenName.Length - 1 - 2, 2)}" + + $"{AccountID.ToString().Substring(0, 3)}{AccountID.ToString().Substring(AccountID.ToString().Length - 1 - 3, 3)}" + + $"{new string(specified4B.ToCharArray().Select(c => (char) (c >> 1)).ToArray())}" + + @"Q#C_3*9" + + $"{ProfileImageUrl.Substring(ProfileImageUrl.Length - 1 - 5, 5)}" + + @"P!z2a@").ToSecureString(); + #endregion + } + + [XmlRoot(IsNullable = false)] + public class CTwitterAccountTokenInformation { + public string AccessToken { get; set; } + public string AccessTokenSecret { get; set; } + public bool Secured { get; set; } = false; + } + + [XmlRoot(IsNullable = false)] + public class CUserInterfaceSettings { + public string Language { get; set; } = CultureInfo.InstalledUICulture.Name; + public float ComposeWindowOpacity { get; set; } = 1; + public bool TopMost { get; set; } = false; + public bool OpenProfilePageOnAccountClick { get; set; } = false; + public bool ShowProfileImage { get; set; } = true; + public bool SaveLastAccountPosition { get; set; } = true; + public ushort ComposeTextFontSize { get; set; } = 15; + public int LastAccountPosition { get; set; } = -1; + + [XmlIgnore] + public object this[string propertyName] { + get => GetType().GetProperty(propertyName).GetValue(this, null); + set => GetType().GetProperty(propertyName).SetValue(this, value, null); + } + } + #endregion + + public sealed class ConfigurationInvalidException : Exception { + public ConfigurationInvalidException() { } + public ConfigurationInvalidException(string message) : base(message) { } + public ConfigurationInvalidException(string message, Exception inner) : base(message, inner) { } + public ConfigurationInvalidException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/QuiqCompose/Classes/Helpers/CommandHelper.cs b/QuiqCompose/Classes/Helpers/CommandHelper.cs new file mode 100644 index 0000000..a00f8ff --- /dev/null +++ b/QuiqCompose/Classes/Helpers/CommandHelper.cs @@ -0,0 +1,182 @@ +#pragma warning disable CS0067 + +using System; +using System.Windows; +using System.Windows.Input; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + /// + /// A bunch of ICommand implementations for easier usage. + /// + public sealed class CommandHelper { + /// + /// Easy-to-use ICommand implementation for control boolean-type UI configurations. + /// + /// REQUIRES CommandParameter passed as boolean type. + /// + public sealed class UiConfigurationBoolCommand : ICommand { + public event EventHandler CanExecuteChanged; + public bool CanBeExecuted { get; set; } = false; + private readonly string _configurationName; + + /// + /// Construct UiConfigurationOnOffCommand + /// + /// Configuration name in UIConfigurations. + /// Set or unset this command can be executed. + public UiConfigurationBoolCommand(string configurationName, bool canBeExecuted = true) { + _configurationName = configurationName; + CanBeExecuted = canBeExecuted; + } + + public bool CanExecute(object parameter) => CanBeExecuted; + + public void Execute(object parameter) { + if(ConfigurationManager.IsConfigurationReady() + && !string.IsNullOrWhiteSpace(_configurationName) + && parameter is bool paramBool) { + ConfigurationManager.ConfigurationInstance.UIConfigurations[_configurationName] = paramBool; + ConfigurationManager.Save(); + } + } + } + + /// + /// Easy-to-use ICommand implementation for start process. + /// + /// REQUIRES either CommandParameter as absolute path string or absolute path that passed via constructor. + /// + public sealed class ProcessStartCommand : ICommand { + public event EventHandler CanExecuteChanged; + public bool CanBeExecuted { get; set; } = false; + private readonly Action _actionIfStartFailed = null; + private readonly string _pathToBeExecuted = null; + + /// + /// Construct ProcessStartCommand. + /// + /// Absolute path to be started. If you leave this parameter null, CommandParameter will be used as the path. + /// An action if starting a process fails. + /// Set or unset this command can be executed. + public ProcessStartCommand(string pathToBeExecuted = null, Action actionIfFail = null, bool canBeExecuted = true) { + _pathToBeExecuted = pathToBeExecuted; + _actionIfStartFailed = actionIfFail; + CanBeExecuted = canBeExecuted; + } + + public bool CanExecute(object parameter) => CanBeExecuted; + + public void Execute(object parameter) { + string path = null; + + if(!string.IsNullOrWhiteSpace(_pathToBeExecuted)) { + path = _pathToBeExecuted; + } else if(parameter is string paramPath && !string.IsNullOrWhiteSpace(paramPath)) { + path = paramPath; + } + + if(!string.IsNullOrWhiteSpace(path) && Uri.TryCreate(path, UriKind.Absolute, out _)) { + ProcessStartHelper.StartProcess(path, _actionIfStartFailed); + } + } + } + + /// + /// Easy-to-use ICommand implementation to show a window. + /// + /// REQUIRES a type of window that passed via constructor. + /// Owner window will be set to application's current main window, if not specified. + /// + public sealed class ShowWindowCommand : ICommand { + public event EventHandler CanExecuteChanged; + public bool CanBeExecuted { get; set; } = false; + private readonly Type _windowType = null; + private readonly Window _ownerWindow = null; + private readonly bool _showWindowAsDialog = false; + + /// + /// Construct ShowWindowCommand. + /// + /// A type of window to be shown. + /// Specify the owner window of parameter `window`. If leave this null, the application's current main window will own it. + /// Whether to show the window as dialog. + /// Set or unset this command can be executed. + public ShowWindowCommand(Type windowType, Window ownerWindow = null, bool showWindowAsDialog = false, bool canBeExecuted = true) { + _windowType = windowType; + _ownerWindow = ownerWindow; + _showWindowAsDialog = showWindowAsDialog; + CanBeExecuted = canBeExecuted; + } + + public bool CanExecute(object parameter) => CanBeExecuted; + + public void Execute(object parameter) { + Window window = (Window) Activator.CreateInstance(_windowType); + + if(window != null) { + window.Owner = _ownerWindow ?? Application.Current.MainWindow; + + if(_showWindowAsDialog) { + window.ShowDialog(); + } else { + window.Show(); + } + } + } + } + + /// + /// Easy-to-use ICommand implementation to close a window. + /// + /// REQUIRES either an instance of Window that passed via constructor or an Window that passed via CommandParameter. + /// + public sealed class CloseWindowCommand : ICommand { + public event EventHandler CanExecuteChanged; + public bool CanBeExecuted { get; set; } = false; + private readonly Window _windowToBeClosed = null; + + /// + /// Construct CloseWindowCommand. + /// + /// An instance of Window. If leave this null, CommandParameter will be used instead. + /// Set or unset this command can be executed. + public CloseWindowCommand(Window windowToBeClosed = null, bool canBeExecuted = true) { + _windowToBeClosed = windowToBeClosed; + CanBeExecuted = canBeExecuted; + } + + public bool CanExecute(object parameter) => CanBeExecuted; + + public void Execute(object parameter) { + if(_windowToBeClosed != null) { + _windowToBeClosed.Close(); + } else if(parameter != null && parameter is Window paramWindow) { + paramWindow.Close(); + } + } + } + + /// + /// Easy-to-use ICommand implementation to simply execute an Action + /// + public sealed class BasicActionCommand : ICommand { + public event EventHandler CanExecuteChanged; + public bool CanBeExecuted { get; set; } = false; + private readonly Action _action = null; + + /// + /// Construct BasicActionCommand. + /// + /// An action to be executed. + /// Set or unset this command can be executed. + public BasicActionCommand(Action action, bool canBeExecuted = true) { + _action = action; + CanBeExecuted = canBeExecuted; + } + + public bool CanExecute(object parameter) => CanBeExecuted; + + public void Execute(object parameter) => _action?.Invoke(); + } + } +} diff --git a/QuiqCompose/Classes/Helpers/ImageCacheHelper.cs b/QuiqCompose/Classes/Helpers/ImageCacheHelper.cs new file mode 100644 index 0000000..ad8515a --- /dev/null +++ b/QuiqCompose/Classes/Helpers/ImageCacheHelper.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Windows.Media.Imaging; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + public static class ImageCacheHelper { + /// + /// Caches a SNS account's image from URL. + /// + /// Absolute image URL to be downloaded from. + /// ScreenName of the account. + /// User ID of the account. + /// Specifies the type of image. + /// Whether to overwrite existing cached image. + /// `true` if the cache process has done successfully, `false` if not. + /// + /// + public static bool Cache(string url, string screenName, long userId, ImageCacheType cacheType, bool overwrite = true) { + #region 1. Download file from `url` + string tempFilePath = Path.GetTempFileName(); + + WebClient client = new WebClient(); + client.DownloadFile(url, tempFilePath); + + if(!File.Exists(tempFilePath)) { + return false; + } + #endregion + + #region 2. Determine image type for downloaded file + var header = new byte[8]; + ImageHeaderInfo.ImageType determinedType = ImageHeaderInfo.ImageType.UNKNOWN; + + using(var fileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read, FileShare.None)) { + if(fileStream.Length > 0) { + fileStream.Read(header, 0, header.Length); + } + } + + var headerHexString = string.Concat(header.Select(v => v.ToString("X2")).ToArray()); + + foreach(var type in ImageHeaderInfo.StringHexOfTypes) { + if(headerHexString.StartsWith(type.Value)) { + determinedType = type.Key; + break; + } + } + + if(determinedType == ImageHeaderInfo.ImageType.UNKNOWN) { + return false; // If the process has failed or not supported format + } + #endregion + + #region 3. Move/Overwrite downloaded temp image file into QuiqCompose cache folder + string destinationFileName = $"{screenName}_{userId}-{cacheType.ToString().ToLower()}"; + string destinationFullPath = Path.Combine(ApplicationData.Instance.GetImageCacheFolderAbsolutePath(), destinationFileName); + + if(!Directory.Exists(ApplicationData.Instance.GetImageCacheFolderAbsolutePath())) { + Directory.CreateDirectory(ApplicationData.Instance.GetImageCacheFolderAbsolutePath()); + } + + if(overwrite && File.Exists(destinationFullPath)) { + File.Delete(destinationFullPath); + } else if(!overwrite && File.Exists(destinationFullPath)) { + throw new InvalidOperationException("Cached file already exists and overwriting is not permitted."); + } + + File.Move(tempFilePath, destinationFullPath); + + if(!File.Exists(destinationFullPath)) { + return false; + } + #endregion + + #region 4. Check if cached image can be loaded into BitmapImage + try { + var testImage = new BitmapImage(new Uri(destinationFullPath)); + + if(testImage != null && testImage.Height > 0 && testImage.Width > 0) { + return true; + } + } catch(Exception) { + return false; + } + #endregion + + return false; + } + + public static BitmapImage LoadCachedImage(string screenName, long userId, ImageCacheType cacheType) { + string fileName = $"{screenName}_{userId}-{cacheType.ToString().ToLower()}"; + string fullPath = Path.Combine(ApplicationData.Instance.GetImageCacheFolderAbsolutePath(), fileName); + + if(File.Exists(fullPath) && (new FileInfo(fileName)).Length > 0) { + var image = new BitmapImage(new Uri(fullPath)); + + if(image != null && (image.Width > 0 && image.Height > 0)) { + return image; + } + } + + return null; + } + + public static bool DeleteCachedImage(string screenName, string userId, ImageCacheType cacheType) { + string fileName = $"{screenName}_{userId}-{cacheType.ToString().ToLower()}"; + string fullPath = Path.Combine(ApplicationData.Instance.GetImageCacheFolderAbsolutePath(), fileName); + + if(File.Exists(fullPath)) { + File.Delete(fullPath); + + if(!File.Exists(fullPath)) { + return true; + } + } + + return false; + } + + public static class ImageHeaderInfo { + public const string JPG = "FFD8"; + public static readonly byte[] JPG_BYTE = { 0xFF, 0xD8 }; + public const string GIF = "474946"; + public static readonly byte[] GIF_BYTE = { 0x47, 0x49, 0x46 }; + public const string PNG = "89504E470D0A1A0A"; + public static readonly byte[] PNG_BYTE = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; + public const string WEBP = "52494646"; + public static readonly byte[] WEBP_BYTE = { 0x52, 0x49, 0x46, 0x46 }; + + public static readonly Dictionary StringHexOfTypes = new Dictionary(); + public static readonly Dictionary BytesOfTypes = new Dictionary(); + + public enum ImageType { + JPG, + GIF, + PNG, + WEBP, + UNKNOWN + } + + static ImageHeaderInfo() { + StringHexOfTypes.Add(ImageType.JPG, JPG); + StringHexOfTypes.Add(ImageType.GIF, GIF); + StringHexOfTypes.Add(ImageType.PNG, PNG); + StringHexOfTypes.Add(ImageType.WEBP, WEBP); + + BytesOfTypes.Add(ImageType.JPG, JPG_BYTE); + BytesOfTypes.Add(ImageType.GIF, GIF_BYTE); + BytesOfTypes.Add(ImageType.PNG, PNG_BYTE); + BytesOfTypes.Add(ImageType.WEBP, WEBP_BYTE); + } + } + + public enum ImageCacheType { + PROFILE, + BANNER + } + } +} diff --git a/QuiqCompose/Classes/Helpers/JsonHelper.cs b/QuiqCompose/Classes/Helpers/JsonHelper.cs new file mode 100644 index 0000000..8c84375 --- /dev/null +++ b/QuiqCompose/Classes/Helpers/JsonHelper.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Newtonsoft.Json; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + public static class JsonHelper { + public static ICollection DeserializeEmbeddedFileToList(string path) { + string assemblyPath = typeof(App).Namespace; + string askedPath = $"{assemblyPath}{(!(path.StartsWith("/") || path.StartsWith("\\")) ? "." : "")}{path.Replace('/', '.').Replace('\\', '.').Replace(' ', '_')}"; + string rawJson; + + using(Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(askedPath)) { + if(stream == null) return null; + + using(StreamReader reader = new StreamReader(stream)) { + rawJson = reader.ReadToEnd(); + } + } + + if(rawJson.Equals(string.Empty) || rawJson == null) { + return null; + } else { + return JsonConvert.DeserializeObject>(rawJson); + } + } + } +} diff --git a/QuiqCompose/Classes/Helpers/LocalizeHelper.cs b/QuiqCompose/Classes/Helpers/LocalizeHelper.cs new file mode 100644 index 0000000..214ecdf --- /dev/null +++ b/QuiqCompose/Classes/Helpers/LocalizeHelper.cs @@ -0,0 +1,24 @@ +using System.Globalization; +using System.Threading; +using WPFLocalizeExtension.Engine; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + public sealed class LocalizeHelper { + public static string GetLocalizedString(string key) + => (string) LocalizeDictionary.Instance.GetLocalizedObject(key, null, LocalizeDictionary.CurrentCulture); + + public static void SetCurrentUICulture(CultureInfo cultureInfo) { + LocalizeDictionary.Instance.Culture = cultureInfo; + Thread.CurrentThread.CurrentUICulture = cultureInfo; + CultureInfo.CurrentUICulture = cultureInfo; + CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; + LocalizeDictionary.Instance.SetCurrentThreadCulture = true; + } + + public static CultureInfo GetDefaultCurrentUICulture() + => CultureInfo.DefaultThreadCurrentUICulture; + + public static CultureInfo GetCurrentThreadUICulture() + => Thread.CurrentThread.CurrentUICulture; + } +} diff --git a/QuiqCompose/Classes/Helpers/ProcessStartHelper.cs b/QuiqCompose/Classes/Helpers/ProcessStartHelper.cs new file mode 100644 index 0000000..be1fb5c --- /dev/null +++ b/QuiqCompose/Classes/Helpers/ProcessStartHelper.cs @@ -0,0 +1,20 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Windows; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + public sealed class ProcessStartHelper { + public static void StartProcess(string fileName, Action actionIfFail = null) { + try { + Process.Start(fileName); + } catch(FileNotFoundException) { + MessageBox.Show("File to be started is not found."); + actionIfFail?.Invoke(); + } catch { + MessageBox.Show("A process can't be started."); + actionIfFail?.Invoke(); + } + } + } +} diff --git a/QuiqCompose/Classes/Helpers/Security/SecureStringExtensions.cs b/QuiqCompose/Classes/Helpers/Security/SecureStringExtensions.cs new file mode 100644 index 0000000..98f8fdb --- /dev/null +++ b/QuiqCompose/Classes/Helpers/Security/SecureStringExtensions.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security { + internal static class SecureStringExtensions { + internal static SecureString ToSecureString(this string value, bool sealString = true) { + if(string.IsNullOrEmpty(value)) { + return null; + } + + SecureString securedValue = new SecureString(); + value.ToCharArray().ToList().ForEach(securedValue.AppendChar); + + if(sealString) { + securedValue.MakeReadOnly(); + } + + return securedValue; + } + + internal static string ReadAsString(this SecureString value) { + if(value == null) { + return null; + } + + IntPtr valuePtr = IntPtr.Zero; + try { + valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value); + return Marshal.PtrToStringUni(valuePtr); + } finally { + Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); + } + } + } +} diff --git a/QuiqCompose/Classes/Helpers/Security/StringCryptoExtensions.cs b/QuiqCompose/Classes/Helpers/Security/StringCryptoExtensions.cs new file mode 100644 index 0000000..b987210 --- /dev/null +++ b/QuiqCompose/Classes/Helpers/Security/StringCryptoExtensions.cs @@ -0,0 +1,81 @@ +using System; +using System.IO; +using System.Linq; +using System.Security; +using System.Security.Cryptography; +using System.Text; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security { + internal static class StringCryptoExtensions { + private const int _keySize = 256; + + /// + /// Encrypt plainText + /// + /// Text to be encrypted + /// PW + /// SLT; should ASCII characters + /// INITVEC; should exactly 32B(256bit) ASCII characters + /// Base64 encoded, encrypted text string + internal static SecureString Encrypt(this string plainText, string p, string s, string iv) { + byte[] ivBytes = Encoding.ASCII.GetBytes(iv).Select(e => (byte) (e >> 1)).ToArray(); + byte[] sBytes = Encoding.ASCII.GetBytes(s + ApplicationData.Instance.CryptoSalt).Select(e => (byte) (e << 1)).ToArray(); + byte[] plainTextBytes = Encoding.Unicode.GetBytes(plainText); + using(PasswordDeriveBytes pw = new PasswordDeriveBytes(p, sBytes, HashAlgorithmName.SHA256.Name, 3)) { + byte[] keyBytes = pw.GetBytes(_keySize / 8); + using(RijndaelManaged symKey = new RijndaelManaged() { + Mode = CipherMode.CBC, + BlockSize = _keySize, + KeySize = _keySize, + Padding = PaddingMode.PKCS7 + }) { + ICryptoTransform enc = symKey.CreateEncryptor(keyBytes, ivBytes); + byte[] cipherTextBytes; + using(MemoryStream memoryStream = new MemoryStream()) { + using(CryptoStream cryptoStream = new CryptoStream(memoryStream, enc, CryptoStreamMode.Write)) { + cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); + } + + cipherTextBytes = memoryStream.ToArray(); + } + + return Convert.ToBase64String(cipherTextBytes).ToSecureString(); + } + } + } + + /// + /// Decrypt cipherText + /// + /// Encrypted text to be decrypted + /// PW + /// SLT; should ASCII characters + /// INITVEC; should exactly 32B(256bit) ASCII characters + /// Decrypted text string + internal static SecureString Decrypt(this string cipherText, string p, string s, string iv) { + byte[] ivBytes = Encoding.ASCII.GetBytes(iv).Select(e => (byte) (e >> 1)).ToArray(); + byte[] sBytes = Encoding.ASCII.GetBytes(s + ApplicationData.Instance.CryptoSalt).Select(e => (byte) (e << 1)).ToArray(); + byte[] cipherTextBytes = Convert.FromBase64String(cipherText); + using(PasswordDeriveBytes pw = new PasswordDeriveBytes(p, sBytes, HashAlgorithmName.SHA256.Name, 3)) { + byte[] keyBytes = pw.GetBytes(_keySize / 8); + using(RijndaelManaged symKey = new RijndaelManaged() { + Mode = CipherMode.CBC, + BlockSize = _keySize, + KeySize = _keySize, + Padding = PaddingMode.PKCS7 + }) { + ICryptoTransform dec = symKey.CreateDecryptor(keyBytes, ivBytes); + byte[] plainTextBytes = new byte[cipherTextBytes.Length]; + int decByteCount; + using(MemoryStream memoryStream = new MemoryStream(cipherTextBytes)) { + using(CryptoStream cryptoStream = new CryptoStream(memoryStream, dec, CryptoStreamMode.Read)) { + decByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); + } + } + + return Encoding.Unicode.GetString(plainTextBytes, 0, decByteCount).ToSecureString(); + } + } + } + } +} diff --git a/QuiqCompose/Classes/Helpers/TweetinviHelper.cs b/QuiqCompose/Classes/Helpers/TweetinviHelper.cs new file mode 100644 index 0000000..3e3c7f2 --- /dev/null +++ b/QuiqCompose/Classes/Helpers/TweetinviHelper.cs @@ -0,0 +1,116 @@ +using System; +using System.IO; +using System.Linq; +using System.Security; +using System.Threading.Tasks; +using SDSK.QuiqCompose.WinDesktop.Classes.Helpers.Security; +using Tweetinvi; +using Tweetinvi.Core.Public.Parameters; +using Tweetinvi.Models; +using Tweetinvi.Parameters; + +namespace SDSK.QuiqCompose.WinDesktop.Classes.Helpers { + public static class TweetinviHelper { + public static void SetCredentialsWithTokens(SecureString accessToken, SecureString accessTokenSecret, bool applicationWide = true) + => SetCredentialsWithTokens(accessToken.ReadAsString(), accessTokenSecret.ReadAsString(), applicationWide); + + public static void SetCredentialsWithTokens(string accessToken, string accessTokenSecret, bool applicationWide = true) { + if(applicationWide) { + Auth.ApplicationCredentials = Auth.CreateCredentials(ApplicationData.Instance.TwitterApp.ConsumerKey.ReadAsString(), + ApplicationData.Instance.TwitterApp.ConsumerSecretKey.ReadAsString(), + accessToken, + accessTokenSecret); + } else { + Auth.Credentials = Auth.CreateCredentials(ApplicationData.Instance.TwitterApp.ConsumerKey.ReadAsString(), + ApplicationData.Instance.TwitterApp.ConsumerSecretKey.ReadAsString(), + accessToken, + accessTokenSecret); + } + } + + public static Tuple SetCredentialsWithPin(IAuthenticationContext context, string pin, bool applicationWide = true) { + var userCreds = AuthFlow.CreateCredentialsFromVerifierCode(pin, context); + + if(userCreds != null) { + var authedUser = User.GetAuthenticatedUser(userCreds); + if(applicationWide) { + Auth.ApplicationCredentials = userCreds; + + if(Auth.ApplicationCredentials.AccessToken == userCreds.AccessToken && + Auth.ApplicationCredentials.AccessTokenSecret == userCreds.AccessTokenSecret) { + return Tuple.Create(true, authedUser); + } + } else { + Auth.Credentials = userCreds; + + if(Auth.Credentials.AccessToken == userCreds.AccessToken && + Auth.Credentials.AccessTokenSecret == userCreds.AccessTokenSecret) { + return Tuple.Create(true, authedUser); + } + } + } + + return Tuple.Create(false, null); + } + + public static ITwitterCredentials GetCredentials(bool applicationWide = true) + => applicationWide ? Auth.CredentialsAccessor.ApplicationCredentials : Auth.CredentialsAccessor.CurrentThreadCredentials; + + public static IAuthenticatedUser GetAuthenticatedUser(bool applicationWide = true) + => User.GetAuthenticatedUser(GetCredentials(applicationWide)); + + public static IAuthenticatedUser GetAuthedUserById(long accId) { + var decryptedAccessTokens = ConfigurationManager.ConfigurationInstance.DecryptAccessTokens(accId); + + return User.GetAuthenticatedUser(Auth.CreateCredentials(ApplicationData.Instance.TwitterApp.ConsumerKey.ReadAsString(), + ApplicationData.Instance.TwitterApp.ConsumerSecretKey.ReadAsString(), + decryptedAccessTokens.Item1.ReadAsString(), + decryptedAccessTokens.Item2.ReadAsString())); + } + + public static Task PublishTweetAsync(IPublishTweetParameters optionalParameters = null) + => Task.Factory.StartNew(() => { + Auth.SetCredentials(Auth.ApplicationCredentials); + + if(Tweet.PublishTweet(optionalParameters) != null) { + return true; + } + + return false; + }); + + public static Task UploadImageAsync(byte[] imageByte, IUploadOptionalParameters optionalParameters = null) + => Task.Run(async () => { + Auth.SetCredentials(Auth.ApplicationCredentials); + + if(await CheckImageCanBeUploaded(imageByte)) { + return Upload.UploadBinary(imageByte, optionalParameters); + } + + return null; + }); + + public static async Task CheckImageCanBeUploaded(byte[] imageByte) { + byte[] headerBytes = null; + + using(MemoryStream stream = new MemoryStream(imageByte)) { + if(stream.CanRead && stream.CanSeek) { + headerBytes = new byte[8]; + await stream.ReadAsync(headerBytes, 0, headerBytes.Length); + } + } + + if(headerBytes != null) { + string headerHexString = string.Concat(headerBytes.Select(v => v.ToString("X2")).ToArray()); + + if(headerHexString.StartsWith(ImageCacheHelper.ImageHeaderInfo.JPG) + || headerHexString.StartsWith(ImageCacheHelper.ImageHeaderInfo.PNG) + || headerHexString.StartsWith(ImageCacheHelper.ImageHeaderInfo.WEBP)) { + return true; + } + } + + return false; + } + } +} diff --git a/QuiqCompose/Controls/MediaThumbnail.xaml b/QuiqCompose/Controls/MediaThumbnail.xaml new file mode 100644 index 0000000..ad7754f --- /dev/null +++ b/QuiqCompose/Controls/MediaThumbnail.xaml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/Controls/MediaThumbnail.xaml.cs b/QuiqCompose/Controls/MediaThumbnail.xaml.cs new file mode 100644 index 0000000..e11ff93 --- /dev/null +++ b/QuiqCompose/Controls/MediaThumbnail.xaml.cs @@ -0,0 +1,45 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; + +namespace SDSK.QuiqCompose.WinDesktop.Controls { + [ContentProperty()] + public partial class MediaThumbnail : UserControl { + public static readonly DependencyProperty ImageSourceProperty = + DependencyProperty.Register( + nameof(ImageSource), + typeof(ImageSource), + typeof(MediaThumbnail)); + + public static readonly DependencyProperty ZoomCommandProperty = + DependencyProperty.Register( + nameof(ZoomCommand), + typeof(ICommand), + typeof(MediaThumbnail)); + + public static readonly DependencyProperty RemoveCommandProperty = + DependencyProperty.Register( + nameof(RemoveCommand), + typeof(ICommand), + typeof(MediaThumbnail)); + + public ImageSource ImageSource { + get => (ImageSource) GetValue(ImageSourceProperty); + set => SetValue(ImageSourceProperty, value); + } + + public ICommand RemoveCommand { + get => (ICommand) GetValue(RemoveCommandProperty); + set => SetValue(RemoveCommandProperty, value); + } + + public ICommand ZoomCommand { + get => (ICommand) GetValue(ZoomCommandProperty); + set => SetValue(ZoomCommandProperty, value); + } + + public MediaThumbnail() => InitializeComponent(); + } +} diff --git a/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml b/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml new file mode 100644 index 0000000..dff11f5 --- /dev/null +++ b/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml.cs b/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml.cs new file mode 100644 index 0000000..ff11bff --- /dev/null +++ b/QuiqCompose/Controls/MetroWindowBottomControlBar.xaml.cs @@ -0,0 +1,44 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Markup; + +namespace SDSK.QuiqCompose.WinDesktop.Controls { + [ContentProperty()] + public partial class MetroWindowBottomControlBar : UserControl { + public static readonly DependencyPropertyKey LeftControlsProperty = + DependencyProperty.RegisterReadOnly( + nameof(LeftControls), + typeof(UIElementCollection), + typeof(MetroWindowBottomControlBar), + new PropertyMetadata()); + public static readonly DependencyPropertyKey RightControlsProperty = + DependencyProperty.RegisterReadOnly( + nameof(RightControls), + typeof(UIElementCollection), + typeof(MetroWindowBottomControlBar), + new PropertyMetadata()); + + public UIElementCollection LeftControls { + get => (UIElementCollection) GetValue(LeftControlsProperty.DependencyProperty); + set => SetValue(LeftControlsProperty, value); + } + + public UIElementCollection RightControls { + get => (UIElementCollection) GetValue(RightControlsProperty.DependencyProperty); + set => SetValue(RightControlsProperty, value); + } + + public MetroWindowBottomControlBar() { + InitializeComponent(); + + LeftControls = PART_LeftControlsHost.Children; + RightControls = PART_RightControlsHost.Children; + } + + private void WindowDragAreaMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { + if(e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) { + Window.GetWindow(this).DragMove(); + } + } + } +} diff --git a/QuiqCompose/FodyWeavers.xml b/QuiqCompose/FodyWeavers.xml new file mode 100644 index 0000000..307e2d2 --- /dev/null +++ b/QuiqCompose/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/QuiqCompose/FodyWeavers.xsd b/QuiqCompose/FodyWeavers.xsd new file mode 100644 index 0000000..44a5374 --- /dev/null +++ b/QuiqCompose/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with line breaks. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with line breaks. + + + + + The order of preloaded assemblies, delimited with line breaks. + + + + + + This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. + + + + + Controls if .pdbs for reference assemblies are also embedded. + + + + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. + + + + + As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. + + + + + Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. + + + + + Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with |. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with |. + + + + + The order of preloaded assemblies, delimited with |. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/QuiqCompose/Properties/AssemblyInfo.cs b/QuiqCompose/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..49ce340 --- /dev/null +++ b/QuiqCompose/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows; + +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면 +// 이러한 특성 값을 변경하세요. +[assembly: AssemblyTitle("QuiqCompose (OSS)")] +[assembly: AssemblyDescription("The fast, simple, anti-disturb SNS composer - Open Source Software")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("SD SkyKlouD")] +[assembly: AssemblyProduct("QuiqCompose")] +[assembly: AssemblyCopyright("Copyright © 2018-2019 SD SkyKlouD, All Rights Reserved.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요. +[assembly: ComVisible(false)] + +//지역화 가능 응용 프로그램 빌드를 시작하려면 다음을 설정하세요. +//.csproj 파일에서 내에 CultureYouAreCodingWith를 +//설정하십시오. 예를 들어 소스 파일에서 영어(미국)를 +//사용하는 경우 를 en-US로 설정합니다. 그런 다음 아래 +//NeutralResourceLanguage 특성의 주석 처리를 제거합니다. 아래 줄의 "en-US"를 업데이트하여 +//프로젝트 파일의 UICulture 설정과 일치시킵니다. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //테마별 리소스 사전의 위치 + //(페이지 또는 응용 프로그램 리소스 사진에 + // 리소스가 없는 경우에 사용됨) + ResourceDictionaryLocation.SourceAssembly //제네릭 리소스 사전의 위치 + //(페이지 또는 응용 프로그램 리소스 사진에 + // 리소스가 없는 경우에 사용됨) +)] + + +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다. +// +// 주 버전 +// 부 버전 +// 빌드 번호 +// 수정 버전 +// +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로 +// 지정되도록 할 수 있습니다. +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.20")] +[assembly: AssemblyFileVersion("1.0.0.20")] +[assembly: Guid("67D39CF6-1C75-446B-A73A-4E2D7FE77D48")] + diff --git a/QuiqCompose/QuiqCompose-WinDesktop.csproj b/QuiqCompose/QuiqCompose-WinDesktop.csproj new file mode 100644 index 0000000..12e7fce --- /dev/null +++ b/QuiqCompose/QuiqCompose-WinDesktop.csproj @@ -0,0 +1,328 @@ + + + + + + Debug + AnyCPU + {698F6795-92B2-4E31-8776-7967AA84F34A} + WinExe + SDSK.QuiqCompose.WinDesktop + QuiqCompose-WinDesktop + v4.6.1 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + + + + + AnyCPU + true + full + false + bin\Debug\ + TRACE;DEBUG + prompt + 4 + false + + + AnyCPU + none + true + bin\Release\ + TRACE + prompt + 4 + false + + + SDSK.QuiqCompose.WinDesktop.App + + + Resources\Icons\Icon.ico + + + false + + + + + + + true + bin\Debug %28Skip Internet check%29\ + TRACE;DEBUG;DEBUG_IGNORE_INTERNET_CONNECTION + full + AnyCPU + prompt + MinimumRecommendedRules.ruleset + + + app.manifest + + + + ..\packages\Autofac.4.9.2\lib\net45\Autofac.dll + + + ..\packages\ControlzEx.3.0.2.4\lib\net45\ControlzEx.dll + + + ..\packages\Costura.Fody.4.0.0\lib\net40\Costura.dll + + + ..\packages\MahApps.Metro.1.6.5\lib\net46\MahApps.Metro.dll + + + ..\packages\MahApps.Metro.IconPacks.Material.2.3.0\lib\net46\MahApps.Metro.IconPacks.Material.dll + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + + ..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll + + + + + ..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll + True + True + + + ..\packages\System.Reflection.TypeExtensions.4.5.1\lib\net461\System.Reflection.TypeExtensions.dll + + + + ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net461\System.Security.Cryptography.Algorithms.dll + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll + + + ..\packages\ControlzEx.3.0.2.4\lib\net45\System.Windows.Interactivity.dll + + + + + 4.0 + + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Controllers.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Core.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Credentials.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Factories.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Logic.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Security.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Streams.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.Webhooks.dll + + + ..\packages\TweetinviAPI.4.0.1\lib\net461\Tweetinvi.WebLogic.dll + + + + + + ..\packages\WPFLocalizeExtension.3.3.1\lib\net452\WPFLocalizeExtension.dll + + + ..\packages\XAMLMarkupExtensions.1.6.0\lib\net452\XAMLMarkupExtensions.dll + + + + + MSBuild:Compile + Designer + + + + + + + + + + + MediaThumbnail.xaml + + + MetroWindowBottomControlBar.xaml + + + ComposeSubWindow.xaml + + + + + + + + + + + PreparationWindow.xaml + + + + + True + True + Strings.resx + + + ComposeWindow.xaml + + + + + + + + + + + + AppInfoWindow.xaml + + + PreparationWindow.xaml + + + SettingsWindow.xaml + + + TwitterLoginWindow.xaml + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + App.xaml + Code + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Code + + + + + + + + + + + + + + + + + Designer + + + Designer + + + PublicResXFileCodeGenerator + Strings.Designer.cs + + + + + {c40d31fd-9280-482e-825d-dac4b0ced8b1} + QuiqCompose-DotNet-Twitter-Text + + + + + + + 이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다. + + + + + \ No newline at end of file diff --git a/QuiqCompose/Resources/Icons/Icon.ico b/QuiqCompose/Resources/Icons/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9358f2c87da02dd9ba3873733e8f8fe55beb8a0d GIT binary patch literal 295912 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 + + + + + + + + + + \ No newline at end of file diff --git a/QuiqCompose/Resources/OpenSourceLibraries.json b/QuiqCompose/Resources/OpenSourceLibraries.json new file mode 100644 index 0000000..b068660 --- /dev/null +++ b/QuiqCompose/Resources/OpenSourceLibraries.json @@ -0,0 +1,90 @@ +[ + { + "libraryName": "Tweetinvi", + "libraryDesc": "Twitter API implementations for .NET", + "libraryUrl": "https://github.com/linvi/tweetinvi", + "licenseType": "MIT", + "dependencies": [ + { + "libraryName": "Autofac", + "libraryDesc": "Autofac is an addictive Inversion of Control container for .NET Core, ASP.NET Core, .NET 4.5.1+, Universal Windows apps, and more.", + "libraryUrl": "https://autofac.org/", + "licenseType": "MIT" + }, + { + "libraryName": "AsyncEx", + "libraryDesc": "A helper library for async/await.", + "libraryUrl": "https://github.com/StephenCleary/AsyncEx", + "licenseType": "MIT" + } + ] + }, + { + "libraryName": "twitter-text", + "libraryDesc": "Twitter Text Libraries (Ported into C# by SD SkyKlouD)", + "libraryUrl": "https://github.com/twitter/twitter-text", + "licenseType": "Apache" + }, + { + "libraryName": "MahApps.Metro", + "libraryDesc": "A toolkit for creating metro-style WPF applications. Lots of goodness out-of-the box.", + "libraryUrl": "https://mahapps.com/", + "licenseType": "MIT", + "dependencies": [ + { + "libraryName": "ControlzEx", + "libraryDesc": "Shared Controlz for WPF", + "libraryUrl": "https://github.com/ControlzEx/ControlzEx", + "licenseType": "MIT" + } + ] + }, + { + "libraryName": "MahApps.Metro.IconPacks.Material", + "libraryDesc": "The IconPacks library contains controls to use awesome icons from Material Design Icons for WPF and UWP apps in a simple way.", + "libraryUrl": "https://github.com/MahApps/MahApps.Metro.IconPacks", + "licenseType": "MIT", + "dependencies": [ + { + "libraryName": "Material Design Icons", + "libraryDesc": "Material Design Icons' growing icon collection allows designers and developers targeting various platforms to download icons in the format, color and size they need for any project.", + "libraryUrl": "https://materialdesignicons.com/", + "licenseType": "SIL" + } + ] + }, + { + "libraryName": "Json.NET", + "libraryDesc": "Popular high-performance JSON framework for .NET", + "libraryUrl": "https://www.newtonsoft.com/json", + "licenseType": "MIT" + }, + { + "libraryName": "Costura.Fody", + "libraryDesc": "Embeds dependencies as resources.", + "libraryUrl": "https://github.com/Fody/Costura", + "licenseType": "MIT", + "dependencies": [ + { + "libraryName": "Fody", + "libraryDesc": "Extensible tool for weaving .net assemblies", + "libraryUrl": "https://github.com/Fody/Fody", + "licenseType": "MIT" + } + ] + }, + { + "libraryName": "WPFLocalizeExtension", + "libraryDesc": "A really easy way to localize any type of DependencyProperties or native Properties on DependencyObjects since 2008", + "libraryUrl": "https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension", + "licenseType": "Ms-PL", + "dependencies": [ + { + "libraryName": "XAMLMarkupExtensions", + "libraryDesc": "A base class for nested markup extensions and a collection of useful extensions for WPF", + "libraryUrl": "https://github.com/XAMLMarkupExtensions/XAMLMarkupExtensions", + "licenseType": "Ms-PL" + } + ] + } +] \ No newline at end of file diff --git a/QuiqCompose/Resources/Styles/AppInfoWindowStyles.xaml b/QuiqCompose/Resources/Styles/AppInfoWindowStyles.xaml new file mode 100644 index 0000000..9e4fb52 --- /dev/null +++ b/QuiqCompose/Resources/Styles/AppInfoWindowStyles.xaml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/QuiqCompose/Resources/Styles/ComposeWindowStyles.xaml b/QuiqCompose/Resources/Styles/ComposeWindowStyles.xaml new file mode 100644 index 0000000..da82c9d --- /dev/null +++ b/QuiqCompose/Resources/Styles/ComposeWindowStyles.xaml @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/QuiqCompose/Resources/Styles/GlobalStyles.xaml b/QuiqCompose/Resources/Styles/GlobalStyles.xaml new file mode 100644 index 0000000..5e6dc3f --- /dev/null +++ b/QuiqCompose/Resources/Styles/GlobalStyles.xaml @@ -0,0 +1,171 @@ + + Segoe UI, Yu Gothic UI, Yu Gothic, Meiryo UI, Meiryo, Microsoft YaHei UI, Microsoft YaHei, 맑은 고딕, Malgun Gothic + + #FF0084B4 + #FF00ACED + #FF1DCAFF + #FFC0DEED + + + + + + + + + + + + \ No newline at end of file diff --git a/QuiqCompose/Resources/Styles/SettingsWindowStyles.xaml b/QuiqCompose/Resources/Styles/SettingsWindowStyles.xaml new file mode 100644 index 0000000..9946ae1 --- /dev/null +++ b/QuiqCompose/Resources/Styles/SettingsWindowStyles.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/QuiqCompose/Translations/Strings.Designer.cs b/QuiqCompose/Translations/Strings.Designer.cs new file mode 100644 index 0000000..724071b --- /dev/null +++ b/QuiqCompose/Translations/Strings.Designer.cs @@ -0,0 +1,683 @@ +//------------------------------------------------------------------------------ +// +// 이 코드는 도구를 사용하여 생성되었습니다. +// 런타임 버전:4.0.30319.42000 +// +// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면 +// 이러한 변경 내용이 손실됩니다. +// +//------------------------------------------------------------------------------ + +namespace SDSK.QuiqCompose.WinDesktop.Translations { + using System; + + + /// + /// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다. + /// + // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder + // 클래스에서 자동으로 생성되었습니다. + // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을 + // 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SDSK.QuiqCompose.WinDesktop.Translations.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을 + /// 재정의합니다. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Dependencies과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string AppInfoWindow_OSL_ShowDepsText { + get { + return ResourceManager.GetString("AppInfoWindow_OSL_ShowDepsText", resourceCulture); + } + } + + /// + /// Open Source Libraries과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string AppInfoWindow_OSLTab_Header { + get { + return ResourceManager.GetString("AppInfoWindow_OSLTab_Header", resourceCulture); + } + } + + /// + /// Overview과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string AppInfoWindow_OverviewTab_Header { + get { + return ResourceManager.GetString("AppInfoWindow_OverviewTab_Header", resourceCulture); + } + } + + /// + /// Version v{0}과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string AppInfoWindow_VersionFormat { + get { + return ResourceManager.GetString("AppInfoWindow_VersionFormat", resourceCulture); + } + } + + /// + /// Media과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeSubWindow_Media_Title { + get { + return ResourceManager.GetString("ComposeSubWindow_Media_Title", resourceCulture); + } + } + + /// + /// Show the list of accounts과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_AccountList_ToolTip { + get { + return ResourceManager.GetString("ComposeWindow_AccountList_ToolTip", resourceCulture); + } + } + + /// + /// Add an account과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_AddAccount_ToolTip { + get { + return ResourceManager.GetString("ComposeWindow_AddAccount_ToolTip", resourceCulture); + } + } + + /// + /// Program informations과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_AppInfo_ToolTip { + get { + return ResourceManager.GetString("ComposeWindow_AppInfo_ToolTip", resourceCulture); + } + } + + /// + /// Open profile page with a browser과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_OpenAccountWithBrowser_ToolTip { + get { + return ResourceManager.GetString("ComposeWindow_OpenAccountWithBrowser_ToolTip", resourceCulture); + } + } + + /// + /// This will remove the account from the list. + ///※ You should re-authenticate if you want to add the account again. Continue?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_RemoveAccount_Message { + get { + return ResourceManager.GetString("ComposeWindow_RemoveAccount_Message", resourceCulture); + } + } + + /// + /// Send과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_Send_ToolTip { + get { + return ResourceManager.GetString("ComposeWindow_Send_ToolTip", resourceCulture); + } + } + + /// + /// Please add an account! + ///Account can be added by pressing plus(+) button above.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint_AddAccount { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint_AddAccount", resourceCulture); + } + } + + /// + /// What are you doing now?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint1 { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint1", resourceCulture); + } + } + + /// + /// What's happening now?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint2 { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint2", resourceCulture); + } + } + + /// + /// What are you thinking now?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint3 { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint3", resourceCulture); + } + } + + /// + /// What do you want to say now?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint4 { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint4", resourceCulture); + } + } + + /// + /// How are you feeling now?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_Hint5 { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_Hint5", resourceCulture); + } + } + + /// + /// Ctrl+Enter : Quick send + ///Ctrl+Mouse Wheel : Zoom in/out the text size과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string ComposeWindow_TextBox_ShortcutsToolTip { + get { + return ResourceManager.GetString("ComposeWindow_TextBox_ShortcutsToolTip", resourceCulture); + } + } + + /// + /// Cancel과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Cancel { + get { + return ResourceManager.GetString("Global_Cancel", resourceCulture); + } + } + + /// + /// Close과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Close { + get { + return ResourceManager.GetString("Global_Close", resourceCulture); + } + } + + /// + /// Download과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Download { + get { + return ResourceManager.GetString("Global_Download", resourceCulture); + } + } + + /// + /// Homepage과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Homepage { + get { + return ResourceManager.GetString("Global_Homepage", resourceCulture); + } + } + + /// + /// No과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_No { + get { + return ResourceManager.GetString("Global_No", resourceCulture); + } + } + + /// + /// OK과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_OK { + get { + return ResourceManager.GetString("Global_OK", resourceCulture); + } + } + + /// + /// QuiqCompose과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_ProgramName { + get { + return ResourceManager.GetString("Global_ProgramName", resourceCulture); + } + } + + /// + /// Settings과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Settings { + get { + return ResourceManager.GetString("Global_Settings", resourceCulture); + } + } + + /// + /// Warning과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Warning { + get { + return ResourceManager.GetString("Global_Warning", resourceCulture); + } + } + + /// + /// Yes과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string Global_Yes { + get { + return ResourceManager.GetString("Global_Yes", resourceCulture); + } + } + + /// + /// The configuration file is invalid. It should be re-created, but the configurations you made before will be gone. + ///If you don't allow to re-create it, QuiqCompose will malfunction. + /// + ///Continue to re-create it?과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Ask_RecreateConfigurationFile { + get { + return ResourceManager.GetString("PreparationWindow_Ask_RecreateConfigurationFile", resourceCulture); + } + } + + /// + /// Checking for Internet connection...과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Status_CheckForInternetConnection { + get { + return ResourceManager.GetString("PreparationWindow_Status_CheckForInternetConnection", resourceCulture); + } + } + + /// + /// Failed to check Internet connection.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Status_CheckForInternetConnection_Failed { + get { + return ResourceManager.GetString("PreparationWindow_Status_CheckForInternetConnection_Failed", resourceCulture); + } + } + + /// + /// Starting check for updates...과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Status_CheckForUpdate { + get { + return ResourceManager.GetString("PreparationWindow_Status_CheckForUpdate", resourceCulture); + } + } + + /// + /// Loading configurations...과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Status_LoadConfigurations { + get { + return ResourceManager.GetString("PreparationWindow_Status_LoadConfigurations", resourceCulture); + } + } + + /// + /// Updating account information...과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string PreparationWindow_Status_UpdateAccountInfo { + get { + return ResourceManager.GetString("PreparationWindow_Status_UpdateAccountInfo", resourceCulture); + } + } + + /// + /// Reset settings과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_BottomBar_Reset { + get { + return ResourceManager.GetString("SettingsWindow_BottomBar_Reset", resourceCulture); + } + } + + /// + /// Do you really want to reset the settings? + ///If you select Yes, the settings except account informations will be reset and the application will be restarted.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_BottomBar_Reset_Message { + get { + return ResourceManager.GetString("SettingsWindow_BottomBar_Reset_Message", resourceCulture); + } + } + + /// + /// Check for updates on application startup과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_General_CheckUpdatesOnStartup { + get { + return ResourceManager.GetString("SettingsWindow_General_CheckUpdatesOnStartup", resourceCulture); + } + } + + /// + /// Language과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_General_Languages { + get { + return ResourceManager.GetString("SettingsWindow_General_Languages", resourceCulture); + } + } + + /// + /// Top Most과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_General_TopMost { + get { + return ResourceManager.GetString("SettingsWindow_General_TopMost", resourceCulture); + } + } + + /// + /// General과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_GeneralTab_Header { + get { + return ResourceManager.GetString("SettingsWindow_GeneralTab_Header", resourceCulture); + } + } + + /// + /// Send to the server how many the tweet has been composed과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Privacy_ReportTweetCount { + get { + return ResourceManager.GetString("SettingsWindow_Privacy_ReportTweetCount", resourceCulture); + } + } + + /// + /// ONLY the tweet count how many you composed will be sent. + ///This information will be used for analytical purpose and to show the total count of composed tweet through this application on the homepage.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Privacy_ReportTweetCount_Hint { + get { + return ResourceManager.GetString("SettingsWindow_Privacy_ReportTweetCount_Hint", resourceCulture); + } + } + + /// + /// This setting would not gather the user's personal information anyway so this setting is permanently enabled.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Privacy_ReportTweetCount_PermanentToolTip { + get { + return ResourceManager.GetString("SettingsWindow_Privacy_ReportTweetCount_PermanentToolTip", resourceCulture); + } + } + + /// + /// Privacy과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_PrivacyTab_Header { + get { + return ResourceManager.GetString("SettingsWindow_PrivacyTab_Header", resourceCulture); + } + } + + /// + /// Open the profile page on click the account from compose window과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Ui_OpenProfilePageOnAccountClick { + get { + return ResourceManager.GetString("SettingsWindow_Ui_OpenProfilePageOnAccountClick", resourceCulture); + } + } + + /// + /// Keep last selected account position과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Ui_SaveLastAccountPosition { + get { + return ResourceManager.GetString("SettingsWindow_Ui_SaveLastAccountPosition", resourceCulture); + } + } + + /// + /// Show account profile image과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_Ui_ShowProfileImage { + get { + return ResourceManager.GetString("SettingsWindow_Ui_ShowProfileImage", resourceCulture); + } + } + + /// + /// Appearance과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string SettingsWindow_UiTab_Header { + get { + return ResourceManager.GetString("SettingsWindow_UiTab_Header", resourceCulture); + } + } + + /// + /// Re-open authentication page과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string TwitterLoginWindow_Commands_Reload { + get { + return ResourceManager.GetString("TwitterLoginWindow_Commands_Reload", resourceCulture); + } + } + + /// + /// The account is already authenticated before. This will refresh the account information.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string TwitterLoginWindow_Messages_AuthedBefore { + get { + return ResourceManager.GetString("TwitterLoginWindow_Messages_AuthedBefore", resourceCulture); + } + } + + /// + /// Failed to make authentication. Please retry.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string TwitterLoginWindow_Messages_Failed { + get { + return ResourceManager.GetString("TwitterLoginWindow_Messages_Failed", resourceCulture); + } + } + + /// + /// Enter 7-digit PIN과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string TwitterLoginWindow_Pin_Hint { + get { + return ResourceManager.GetString("TwitterLoginWindow_Pin_Hint", resourceCulture); + } + } + + /// + /// BETA RELEASE과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_Channel_Beta { + get { + return ResourceManager.GetString("UpdateFoundWindow_Channel_Beta", resourceCulture); + } + } + + /// + /// Official release과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_Channel_Official { + get { + return ResourceManager.GetString("UpdateFoundWindow_Channel_Official", resourceCulture); + } + } + + /// + /// TESTING RELEASE과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_Channel_Testing { + get { + return ResourceManager.GetString("UpdateFoundWindow_Channel_Testing", resourceCulture); + } + } + + /// + /// Unspecified channel과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_Channel_Unspecified { + get { + return ResourceManager.GetString("UpdateFoundWindow_Channel_Unspecified", resourceCulture); + } + } + + /// + /// Current version is v{0}과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_CurrentVer { + get { + return ResourceManager.GetString("UpdateFoundWindow_CurrentVer", resourceCulture); + } + } + + /// + /// A new version is ready to go!과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_FoundText { + get { + return ResourceManager.GetString("UpdateFoundWindow_FoundText", resourceCulture); + } + } + + /// + /// Version v{0}, released on {1}과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_NewVerAndDate { + get { + return ResourceManager.GetString("UpdateFoundWindow_NewVerAndDate", resourceCulture); + } + } + + /// + /// View changelog과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_ViewChangelog { + get { + return ResourceManager.GetString("UpdateFoundWindow_ViewChangelog", resourceCulture); + } + } + + /// + /// The changelog URL seems wrong, or not provided. please contact to developer.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_WrongChangelogUrl { + get { + return ResourceManager.GetString("UpdateFoundWindow_WrongChangelogUrl", resourceCulture); + } + } + + /// + /// The download URL seems wrong, please contact to developer.과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string UpdateFoundWindow_WrongDownloadUrl { + get { + return ResourceManager.GetString("UpdateFoundWindow_WrongDownloadUrl", resourceCulture); + } + } + + /// + /// Application information과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_AppInfo { + get { + return ResourceManager.GetString("WindowTitle_AppInfo", resourceCulture); + } + } + + /// + /// Compose과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_Compose { + get { + return ResourceManager.GetString("WindowTitle_Compose", resourceCulture); + } + } + + /// + /// Preparing...과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_Preparation { + get { + return ResourceManager.GetString("WindowTitle_Preparation", resourceCulture); + } + } + + /// + /// Settings과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_Settings { + get { + return ResourceManager.GetString("WindowTitle_Settings", resourceCulture); + } + } + + /// + /// Twitter authentication과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_TwitterLogin { + get { + return ResourceManager.GetString("WindowTitle_TwitterLogin", resourceCulture); + } + } + + /// + /// A new version found!과(와) 유사한 지역화된 문자열을 찾습니다. + /// + public static string WindowTitle_UpdateFound { + get { + return ResourceManager.GetString("WindowTitle_UpdateFound", resourceCulture); + } + } + } +} diff --git a/QuiqCompose/Translations/Strings.ja.resx b/QuiqCompose/Translations/Strings.ja.resx new file mode 100644 index 0000000..3713cad --- /dev/null +++ b/QuiqCompose/Translations/Strings.ja.resx @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 作成 + + + QuiqCompose + クィッコンポーズ + + + 今何をしていますか? + + + Twitterアプリ認証 + + + アカウントを追加 + + + 7桁のPINを入力 + + + アカウントのリストを表示 + + + 送る + + + 設定 + + + プログラム情報 + + + プログラム設定 + + + プログラム情報 + + + 新しいバージョンにアップデート + + + 新しいバージョンの用意ができました! + + + バージョン v{0}、 配布日付:{1} + + + 現在バージョン v{0} + + + ダウンロードURLに問題があるようです。開発者にご連絡ください。 + + + キャンセル + + + ダウンロード + + + 変更点URLに問題があるようたり、提供されていないようです。開発者にご連絡ください。 + + + 変更点を見る + + + Ctrl+Enter : クイック送り +Ctrl+マウスホイール : 文字大きさのズームイン・アウト + + + ブラウザーでプロフィールページを開く + + + 基本 + + + ウィンドウを常に最前面で表示 + + + アプリケーションの起動時にアップデートを自動確認 + + + 外観 + + + 作成ウィンドウでプロフィール画像を押してプロフィールページを開く + + + 準備中… + + + インタネット接続の確認中… + + + インタネット接続の確認ができませんでした。 + + + アカウントのプロフィール画像を表示 + + + 設定の読み込み中… + + + アップデートの確認の開始中… + + + アカウント情報の更新中… + + + 言語 + + + バージョン v{0} + + + 今何が起こっていますか? + + + 今何を考えていますか? + + + 今何を話したいですか? + + + 今気持ちがどうですか? + + + ツイートの作成数をサーバーに転送 + + + 「ツイート作成数だけ」がサーバーに送信されます。 +こんな情報は、分析目的やホームページでこのプログラムを通じて作成されたすべてのツイートの数を表示するために使われます。 + + + プライバシー + + + ベータ版 + + + テスティング版 + + + 公式リリーズ + + + 未指定チャンネル + + + この設定は、個人情報を要求する設定ではありません。それでこの設定は永久に有効にされます。 + + + 設定ファイルが有効ではないので、ファイルを再び生成しなければならないです。ファイルを再び生成すれば既存の設定はすべてリセットされますが、生成しなければQuiqComposeが不能になることができます。 + +設定ファイルを再び生成しますか? + + + OK + + + リセット + + + 本当に設定をリセットしてもいいですか? +「はい」ボタンを押すと、アカウント情報を除いたすべての設定が初期化され、プログラムが再起動されます。 + + + 最後に選択したアカウントの位置を維持 + + + 認証ページを再び開く + + + このアカウントはすでに認証されました。 + + + 認証できませんでした。再びお試しください。 + + + 閉じる + + + プログラム情報 + + + アカウントをリストから除去します。 +※ アカウントは認証の過程を経て再び追加できます。 + + + 警告 + + + オープンソースライブラリ + + + ホームページ + + + 従属ライブラリ + + + はい + + + いいえ + + + メディア + + + アカウントを追加してください! +アカウントは上のプラス(+)ボタンを押して追加できます! + + + メディアファイルを開く + + + 画像ファイル + + + 作成ウィンドウの透明度 + + \ No newline at end of file diff --git a/QuiqCompose/Translations/Strings.ko.resx b/QuiqCompose/Translations/Strings.ko.resx new file mode 100644 index 0000000..8be772c --- /dev/null +++ b/QuiqCompose/Translations/Strings.ko.resx @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 작성 + + + QuiqCompose + + + 지금 무엇을 하고 있나요? + + + 트위터 앱 인증 + + + 계정 추가 + + + 7자리 PIN 번호 입력 + + + 계정 목록 보기 + + + 보내기 + + + 설정 + + + 프로그램 정보 + + + 프로그램 설정 + + + 프로그램 정보 + + + 업데이트 확인 + + + 새로운 버전이 준비되었습니다! + + + 버전 v{0}, 배포 일자 : {1} + + + 현재 버전 v{0} + + + 다운로드 URL에 문제가 있는 것 같습니다. 개발자에게 연락 바랍니다. + + + 취소 + + + 다운로드 + + + 변경 사항 URL에 문제가 있거나 제공되지 않은 것 같습니다. 개발자에게 연락 바랍니다. + + + 변경 사항 보기 + + + Ctrl+Enter : 바로 보내기 +Ctrl+마우스 휠 : 글씨 크기 줌 인/줌 아웃 + + + 브라우저에서 프로필 페이지 열기 + + + 기본 + + + 창을 항상 위로 표시 + + + 애플리케이션 실행 시 업데이트 확인 + + + 외관 + + + 작성 창에서 프로필 이미지를 누르면 프로필 페이지 열기 + + + 준비 중... + + + 인터넷 연결 확인 중... + + + 인터넷 연결을 확인할 수 없습니다. + + + 계정의 프로필 이미지 표시 + + + 설정을 불러오는 중... + + + 업데이트 확인 시작 중... + + + 계정 정보 업데이트 중... + + + 언어 + + + 버전 v{0} + + + 지금 무슨 일이 일어나고 있나요? + + + 지금 무슨 생각을 하고 있나요? + + + 지금 하고 싶은 말이 무엇인가요? + + + 지금 기분이 어떤가요? + + + 트윗 작성 횟수를 서버로 전송 + + + "오직" 작성된 트윗 개수만 서버로 전송됩니다. +이 정보는 분석 및 홈페이지에서의 이 프로그램을 통해 작성된 총 트윗 개수 표시용으로 사용될 예정입니다. + + + 개인 정보 + + + 베타 릴리즈 + + + 테스팅 릴리즈 + + + 공식 릴리즈 + + + 미지정된 채널 + + + 이 설정은 사용자 개인 정보를 요구하는 설정이 아님으로 판단되어, 영구히 활성화되었습니다. + + + 설정 파일에 문제가 발견되어 파일을 다시 생성해야합니다. 파일을 다시 생성하게 되면 기존의 설정들은 전부 초기화됩니다. +설정 파일을 다시 생성하지 않는다면, QuiqCompose가 오작동할 가능성이 큽니다. + +설정 파일을 다시 생성하시겠습니까? + + + 확인 + + + 설정 초기화 + + + 정말로 설정을 초기화하시겠습니까? +"예"를 선택하면, 계정 정보를 제외한 모든 설정이 초기화되고 프로그램이 재시작됩니다. + + + 마지막으로 선택한 계정 위치 유지 + + + 인증 페이지 다시 열기 + + + 이 계정은 이미 인증되었습니다. + + + 오류로 인해 계정을 인증할 수 없었습니다. 다시 시도해 주세요. + + + 닫기 + + + 프로그램 정보 + + + 해당 계정을 목록에서 삭제합니다. +※ 목록에 계정을 다시 추가하려면 인증 과정을 다시 거쳐야 합니다. + + + 경고 + + + 오픈 소스 라이브러리 + + + 홈페이지 + + + 종속 라이브러리 + + + + + + 아니오 + + + 미디어 + + + 계정을 추가해주세요! +계정은 상단의 더하기(+) 버튼을 눌러 추가할 수 있어요. + + + 미디어 파일 선택 + + + 사진 및 그림 파일 + + + 작성 창 투명도 + + \ No newline at end of file diff --git a/QuiqCompose/Translations/Strings.resx b/QuiqCompose/Translations/Strings.resx new file mode 100644 index 0000000..6ddc81a --- /dev/null +++ b/QuiqCompose/Translations/Strings.resx @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Compose + + + QuiqCompose + + + What are you doing now? + + + Twitter authentication + + + Add an account + + + Enter 7-digit PIN + + + Show the list of accounts + + + Send + + + Settings + + + Program informations + + + Settings + + + Application information + + + A new version found! + + + A new version is ready to go! + + + Version v{0}, released on {1} + + + Current version is v{0} + + + The download URL seems wrong, please contact to developer. + + + Cancel + + + Download + + + The changelog URL seems wrong, or not provided. please contact to developer. + + + View changelog + + + Ctrl+Enter : Quick send +Ctrl+Mouse Wheel : Zoom in/out the text size + + + Open profile page with a browser + + + General + + + Top Most + + + Check for updates on application startup + + + Appearance + + + Open the profile page on click the profile image in compose window + + + Preparing... + + + Checking for Internet connection... + + + Failed to check Internet connection. + + + Show account profile image + + + Loading configurations... + + + Starting check for updates... + + + Updating account information... + + + Language + + + Version v{0} + + + What's happening now? + + + What are you thinking now? + + + What do you want to say now? + + + How are you feeling now? + + + Send to the server how many the tweet has been composed + + + ONLY the tweet count how many you composed will be sent. +This information will be used for analytical purpose and to show the total count of composed tweet through this application on the homepage. + + + Privacy + + + BETA RELEASE + + + TESTING RELEASE + + + Official release + + + Unspecified channel + + + This setting would not gather the user's personal information anyway so this setting is permanently enabled. + + + The configuration file is invalid. It should be re-created, but the configurations you made before will be gone. +If you don't allow to re-create it, QuiqCompose will malfunction. + +Continue to re-create it? + + + OK + + + Reset settings + + + Do you really want to reset the settings? +If you select Yes, the settings except account informations will be reset and the application will be restarted. + + + Keep last selected account position + + + Re-open authentication page + + + The account is already authenticated before. + + + Failed to make authentication. Please retry. + + + Close + + + Overview + + + This will remove the account from the list. +※ You should re-authenticate if you want to add the account again. Continue? + + + Warning + + + Open Source Libraries + + + Homepage + + + Dependencies + + + Yes + + + No + + + Media + + + Please add an account! +Account can be added by pressing plus(+) button above. + + + Select media file(s) + + + Still images/pictures + + + Opacity (compose window) + + \ No newline at end of file diff --git a/QuiqCompose/Windows/AppInfoWindow.xaml b/QuiqCompose/Windows/AppInfoWindow.xaml new file mode 100644 index 0000000..8909738 --- /dev/null +++ b/QuiqCompose/Windows/AppInfoWindow.xaml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/Windows/ComposeSubWindow.xaml.cs b/QuiqCompose/Windows/ComposeSubWindow.xaml.cs new file mode 100644 index 0000000..abda4e8 --- /dev/null +++ b/QuiqCompose/Windows/ComposeSubWindow.xaml.cs @@ -0,0 +1,7 @@ +using MahApps.Metro.Controls; + +namespace SDSK.QuiqCompose.WinDesktop.Windows { + public partial class ComposeSubWindow : MetroWindow { + public ComposeSubWindow() => InitializeComponent(); + } +} diff --git a/QuiqCompose/Windows/ComposeWindow.xaml b/QuiqCompose/Windows/ComposeWindow.xaml new file mode 100644 index 0000000..5de20f5 --- /dev/null +++ b/QuiqCompose/Windows/ComposeWindow.xaml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/Windows/TwitterLoginWindow.xaml.cs b/QuiqCompose/Windows/TwitterLoginWindow.xaml.cs new file mode 100644 index 0000000..360cd62 --- /dev/null +++ b/QuiqCompose/Windows/TwitterLoginWindow.xaml.cs @@ -0,0 +1,13 @@ +using System.Text.RegularExpressions; +using System.Windows.Input; +using MahApps.Metro.Controls; + +namespace SDSK.QuiqCompose.WinDesktop.Windows { + public partial class TwitterLoginWindow : MetroWindow { + public TwitterLoginWindow() + => InitializeComponent(); + + private void PINTextBoxAcceptOnlyNumbers(object sender, TextCompositionEventArgs e) + => e.Handled = new Regex("[^0-9]+").IsMatch(e.Text); + } +} diff --git a/QuiqCompose/app.manifest b/QuiqCompose/app.manifest new file mode 100644 index 0000000..c9776f1 --- /dev/null +++ b/QuiqCompose/app.manifest @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QuiqCompose/packages.config b/QuiqCompose/packages.config new file mode 100644 index 0000000..ee6808a --- /dev/null +++ b/QuiqCompose/packages.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..64415c9 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +![QuiqCompose Banner](DocumentationResources/QCBanner.png) +
+ +# 참고!! +QuiqCompose의 데스크톱 앱(WPF) 개발은 잠정 중단합니다. +고로 원 개발자인 SD꽁치(SD SkyKlouD)가 더 이상 직접 개발을 진행하진 않지만, 풀 리퀘스트가 진행되어 기능 변경 등이 생기는 경우 새로운 버전을 릴리즈합니다. + +# QuiqCompose (OSS) +이 프로그램은 트윗 작성에 집중하게 해주면서도 간단한 UI로 빠르고 간편한, ~~트잉질 들킬 염려 없는~~ 트윗 작성 경험을 제공하는 WPF 프로그램입니다. + + + 버전에 따른 변경 사항은 [이 문서](CHANGELOG.md)를 참고해주세요. + +# 개발 참고 사항 + + + OSS로 공개한 이후부터 버전은 편의상 릴리즈 날짜를 버전으로 사용합니다. 어셈블리 버전은 4번째 항목만 버전 업데이트 시 1씩 올라갑니다. + +# 라이선스 + + + [MIT License](LICENSE.md) \ No newline at end of file