using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml.Serialization;
+using OpenTween.Connection;
using OpenTween.Thumbnail;
namespace OpenTween
{
+ [XmlSerializerAssembly(null, null)] // OpenTween アセンブリ内の XmlSerializerContract を使用させる
public class SettingCommon : SettingBase<SettingCommon>
{
#region "Settingクラス基本"
- public static SettingCommon Load()
- => LoadSettings();
+ public static SettingCommon Load(string settingsPath)
+ => LoadSettings(settingsPath);
- public void Save()
- => SaveSettings(this);
+ public void Save(string settingsPath)
+ => SaveSettings(this, settingsPath);
#endregion
public List<UserAccount> UserAccounts = new();
+
+ public Guid? SelectedAccountKey { get; set; } = null;
+
+ [XmlIgnore]
+ public UserAccount? SelectedAccount
+ => this.UserAccounts.Find(x => x.UniqueKey == this.SelectedAccountKey);
+
public string UserName = "";
[XmlIgnore]
public bool TinyUrlResolve = true;
public bool StartupVersion = true;
public bool StartupFollowers = true;
+
+ /// <summary>
+ /// Twitter API v2 の使用を有効にする
+ /// </summary>
+ [XmlIgnore]
+ public bool EnableTwitterV2Api => false;
+
public bool RestrictFavCheck = false;
public bool AlwaysTop = false;
public string CultureCode = "";
[XmlElement(ElementName = nameof(SkipUpdateVersion))]
public string SkipUpdateVersionStr { get; set; } = "";
+
+ public void Validate()
+ {
+ if (this.TimelinePeriod < 0)
+ this.TimelinePeriod = 15;
+
+ if (this.ReplyPeriod < 0)
+ this.ReplyPeriod = 15;
+
+ if (this.DMPeriod < 0)
+ this.DMPeriod = 15;
+
+ if (this.PubSearchPeriod < 0)
+ this.PubSearchPeriod = 30;
+
+ if (this.UserTimelinePeriod < 0)
+ this.UserTimelinePeriod = 15;
+
+ if (this.ListsPeriod < 0)
+ this.ListsPeriod = 15;
+
+ if (!Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Timeline, this.CountApi))
+ this.CountApi = 60;
+
+ if (!Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Reply, this.CountApiReply))
+ this.CountApiReply = 40;
+
+ if (this.MoreCountApi != 0 && !Twitter.VerifyMoreApiResultCount(this.MoreCountApi))
+ this.MoreCountApi = 200;
+
+ if (this.FirstCountApi != 0 && !Twitter.VerifyFirstApiResultCount(this.FirstCountApi))
+ this.FirstCountApi = 100;
+
+ if (this.FavoritesCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.Favorites, this.FavoritesCountApi))
+ this.FavoritesCountApi = 40;
+
+ if (this.ListCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.List, this.ListCountApi))
+ this.ListCountApi = 100;
+
+ if (this.SearchCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.PublicSearch, this.SearchCountApi))
+ this.SearchCountApi = 100;
+
+ if (this.UserTimelineCountApi != 0 && !Twitter.VerifyApiResultCount(MyCommon.WORKERTYPE.UserTimeline, this.UserTimelineCountApi))
+ this.UserTimelineCountApi = 20;
+
+ // 廃止サービスが選択されていた場合ux.nuへ読み替え
+ if (this.AutoShortUrlFirst < 0)
+ this.AutoShortUrlFirst = MyCommon.UrlConverter.Uxnu;
+
+ UserAccount? selectedAccount;
+ if (this.SelectedAccountKey != null)
+ {
+ selectedAccount = this.SelectedAccount;
+ }
+ else
+ {
+ selectedAccount = this.UserAccounts.Find(
+ x => string.Equals(x.Username, this.UserName, StringComparison.InvariantCultureIgnoreCase)
+ );
+ }
+
+ this.SelectedAccountKey = selectedAccount?.UniqueKey;
+
+ if (selectedAccount?.UserId == 0)
+ selectedAccount.UserId = this.UserId;
+
+ if (MyCommon.IsNullOrEmpty(this.Token))
+ this.UserName = "";
+ }
}
public class UserAccount
{
+ public Guid UniqueKey { get; set; } = Guid.NewGuid();
+
public string Username = "";
public long UserId = 0;
+
+ public APIAuthType TwitterAuthType { get; set; } = APIAuthType.OAuth1;
+
+ public string TwitterOAuth1ConsumerKey { get; set; } = "";
+
+ [XmlIgnore]
+ public string TwitterOAuth1ConsumerSecret { get; set; } = "";
+
+ public string TwitterOAuth1ConsumerSecretEncrypted
+ {
+ get => this.Encrypt(this.TwitterOAuth1ConsumerSecret);
+ set => this.TwitterOAuth1ConsumerSecret = this.Decrypt(value);
+ }
+
+ [XmlIgnore]
+ public string TwitterComCookie { get; set; } = "";
+
+ public string TwitterComCookieEncrypted
+ {
+ get => this.Encrypt(this.TwitterComCookie);
+ set => this.TwitterComCookie = this.Decrypt(value);
+ }
+
public string Token = "";
+
[XmlIgnore]
public string TokenSecret = "";
set => this.TokenSecret = this.Decrypt(value);
}
+ public TwitterAppToken GetTwitterAppToken()
+ {
+ return new()
+ {
+ AuthType = this.TwitterAuthType,
+ OAuth1CustomConsumerKey = MyCommon.IsNullOrEmpty(this.TwitterOAuth1ConsumerKey) ? null : ApiKey.Create(this.TwitterOAuth1ConsumerKey),
+ OAuth1CustomConsumerSecret = MyCommon.IsNullOrEmpty(this.TwitterOAuth1ConsumerSecret) ? null : ApiKey.Create(this.TwitterOAuth1ConsumerSecret),
+ TwitterComCookie = this.TwitterComCookie,
+ };
+ }
+
+ public ITwitterCredential GetTwitterCredential()
+ {
+ var appToken = this.GetTwitterAppToken();
+
+ return appToken.AuthType switch
+ {
+ APIAuthType.OAuth1
+ => new TwitterCredentialOAuth1(appToken, this.Token, this.TokenSecret),
+ APIAuthType.TwitterComCookie
+ => new TwitterCredentialCookie(appToken),
+ _ => new TwitterCredentialNone(),
+ };
+ }
+
private string Encrypt(string password)
{
if (MyCommon.IsNullOrEmpty(password)) password = "";
public override string ToString()
=> this.Username;
}
+
+ public enum APIAuthType
+ {
+ None,
+ OAuth1,
+ TwitterComCookie,
+ }
}
\ No newline at end of file