Skip to content

Commit 2a4e3de

Browse files
authored
Merge pull request #13 from DevAnyKR/multiAuth
다중 계정 인증
2 parents 8d4d0d0 + c7f3abe commit 2a4e3de

14 files changed

Lines changed: 220 additions & 114 deletions

File tree

kr.devany.googleapi.sdPlugin/propertyInspector/adsensemanagement/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@
8181
<div class="sdpi-item-label">Back Color</div>
8282
<input type="color" class="sdpi-item-value sdProperty" value="#000000" id="backColor" oninput="setSettings()">
8383
</div>
84+
<div type="text" class="sdpi-item" id="dvUserTokenName">
85+
<div class="sdpi-item-label">User Token Name</div>
86+
<input type="text" class="sdpi-item-value sdProperty" value="user" id="userTokenName" onkeypress="javascript:if(event.keyCode == 13) setSettings();">
87+
</div>
8488
</div>
8589
</body>
8690
</html>
Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
<!DOCTYPE html>
22
<html>
33
<head>
4-
<meta charset="utf-8" />
5-
<title>Google Calendar</title>
6-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/barraider/streamdeck-easypi@latest/src/sdpi.css">
7-
<script src="https://cdn.jsdelivr.net/gh/barraider/streamdeck-easypi@latest/src/sdtools.common.js"></script>
4+
<meta charset="utf-8" />
5+
<title>Google Calendar</title>
6+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/barraider/streamdeck-easypi@latest/src/sdpi.css">
7+
<script src="https://cdn.jsdelivr.net/gh/barraider/streamdeck-easypi@latest/src/sdtools.common.js"></script>
88

9-
<script src="PluginActionPI.js"></script>
9+
<script src="PluginActionPI.js"></script>
1010
</head>
1111

1212
<body>
13-
<div class="sdpi-wrapper">
14-
<div type="color" class="sdpi-item" id="dvFrontolor">
15-
<div class="sdpi-item-label">Front Color</div>
16-
<input type="color" class="sdpi-item-value sdProperty" value="#FFFFFF" id="frontColor" oninput="setSettings()">
17-
</div>
18-
<div type="color" class="sdpi-item" id="dvBackColor">
19-
<div class="sdpi-item-label">Back Color</div>
20-
<input type="color" class="sdpi-item-value sdProperty" value="#000000" id="backColor" oninput="setSettings()">
21-
</div>
22-
</div>
13+
<div class="sdpi-wrapper">
14+
<div type="color" class="sdpi-item" id="dvFrontolor">
15+
<div class="sdpi-item-label">Front Color</div>
16+
<input type="color" class="sdpi-item-value sdProperty" value="#FFFFFF" id="frontColor" oninput="setSettings()">
17+
</div>
18+
<div type="color" class="sdpi-item" id="dvBackColor">
19+
<div class="sdpi-item-label">Back Color</div>
20+
<input type="color" class="sdpi-item-value sdProperty" value="#000000" id="backColor" oninput="setSettings()">
21+
</div>
22+
<div type="text" class="sdpi-item" id="dvUserTokenName">
23+
<div class="sdpi-item-label">User Token Name</div>
24+
<input type="text" class="sdpi-item-value sdProperty" value="user" id="userTokenName" onkeypress="javascript:if(event.keyCode == 13) setSettings();">
25+
</div>
26+
</div>
2327
</body>
2428
</html>

src/GoogleAPIs/AdSenseManagement/ApiService.cs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
using Google.Apis.Adsense.v2; // https://googleapis.dev/dotnet/Google.Apis.Adsense.v2/latest/api/Google.Apis.Adsense.v2.html
88
using Google.Apis.Adsense.v2.Data;
9+
using Google.Apis.Auth.OAuth2;
910

1011
using DateRangeEnum = Google.Apis.Adsense.v2.AccountsResource.ReportsResource.GenerateRequest.DateRangeEnum;
1112
using DimensionsEnum = Google.Apis.Adsense.v2.AccountsResource.ReportsResource.GenerateRequest.DimensionsEnum;
@@ -16,28 +17,21 @@ namespace StreamDock.Plugins.GoogleAPIs.AdSenseManagement
1617
/// <summary>
1718
/// 구글 API 서비스 대리자
1819
/// </summary>
19-
internal class ApiService
20+
internal class ApiService : GoogleAuth
2021
{
21-
private AdsenseService service;
22-
private int maxListPageSize = 50;
23-
private Account adSenseAccount;
22+
readonly AdsenseService service;
23+
readonly int maxListPageSize = 50;
24+
Account adSenseAccount;
2425

2526
/// <summary>
2627
/// <see cref="ApiService"/> 클래스의 새 인스턴스를 초기화합니다.
2728
/// </summary>
2829
/// <param name="service">요청을 실행할 애드센스 서비스 개체입니다.</param>
2930
/// <param name="maxListPageSize">검색할 최대 페이지 크기입니다.</param>
30-
private ApiService(AdsenseService service)
31+
internal ApiService(UserCredential userCredential, AdsenseService service)
3132
{
3233
this.service = service;
33-
}
34-
/// <summary>
35-
/// 서비스 생성
36-
/// </summary>
37-
/// <returns></returns>
38-
internal static async Task<ApiService> GetService()
39-
{
40-
return new ApiService(new AdsenseService(await GoogleAuth.GetServiceInitializer()));
34+
base.userCredential = userCredential;
4135
}
4236
/// <summary>
4337
/// 로그인한 사용자의 모든 계정을 가져오고 출력합니다.

src/GoogleAPIs/AdSenseManagement/ChartReport.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace StreamDock.Plugins.GoogleAPIs.AdSenseManagement
1212
{
1313
internal class ChartReport
1414
{
15-
PluginSettings pluginSettings;
15+
readonly PluginSettings pluginSettings;
1616

1717
internal ChartReport(PluginSettings pluginSettings)
1818
{

src/GoogleAPIs/AdSenseManagement/DataBinder.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,33 @@
55

66
using BarRaider.SdTools;
77

8+
using Google.Apis.Adsense.v2;
9+
810
namespace StreamDock.Plugins.GoogleAPIs.AdSenseManagement
911
{
1012
/// <summary>
1113
/// API 동작 정의 프로시저
1214
/// </summary>
1315
internal class DataBinder
1416
{
15-
PluginSettings pluginSettings { get; set; }
16-
Item item { get; set; }
17-
17+
PluginSettings pluginSettings;
18+
Item item;
19+
GoogleAuth googleAuth;
1820
internal DataBinder(PluginSettings pluginsettings, Item item)
1921
{
2022
this.pluginSettings = pluginsettings;
2123
this.item = item;
24+
this.googleAuth = new();
2225
}
2326
/// <summary>
2427
/// 키가 눌렸을 때 동작 정의. Google API 통신.
2528
/// </summary>
2629
internal async Task<Item> ExecuteAsync()
2730
{
28-
Item _item = this.item;
29-
3031
try
3132
{
3233
// 구글 API 통신 인스턴스
33-
ApiService apiSevice = await ApiService.GetService();
34+
ApiService apiSevice = new ApiService(googleAuth.userCredential, new AdsenseService(await googleAuth.GetServiceInitializerAsync(pluginSettings.UserTokenName)));
3435

3536
string accountName = apiSevice.GetAccountName();
3637
if (Item.AccountName.IsNullOrEmpty())
@@ -59,14 +60,14 @@ internal async Task<Item> ExecuteAsync()
5960
Logger.Instance.LogMessage(TracingLevel.INFO, "보고서 저장 완료.");
6061
#endif
6162
// 디스플레이용 데이터 가공
62-
_item = SetDisplayValue();
63+
item = SetDisplayValue();
6364
}
6465
catch (Exception ex)
6566
{
6667
Logger.Instance.LogMessage(TracingLevel.ERROR, ex.Message);
6768
Logger.Instance.LogMessage(TracingLevel.ERROR, ex.StackTrace);
6869
}
69-
return _item;
70+
return item;
7071
}
7172

7273
/// <summary>

src/GoogleAPIs/AdSenseManagement/Models/Item.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ public class Item
2727

2828
internal void Init()
2929
{
30-
Accounts = new List<Account>();
31-
Payments = new List<Payment>();
32-
Sites = new List<Site>();
33-
ReportResults = new Dictionary<IReportKey, ReportResult> { };
34-
ReportCharts = new Dictionary<IReportKey, Image> { };
30+
Accounts?.Clear();
31+
Payments?.Clear();
32+
Sites?.Clear();
33+
ReportResults?.Clear();
34+
ReportCharts?.Clear();
3535
}
3636
}
3737
}

src/GoogleAPIs/AdSenseManagement/Models/PluginSettings.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ namespace StreamDock.Plugins.GoogleAPIs.AdSenseManagement
1414
{
1515
public class PluginSettings : INotifyPropertyChanged
1616
{
17+
//? Json 속성 이름과 CS 속성 이름이 중복되면 안 됨. 대소문자 구분.
1718
[JsonProperty(PropertyName = "resource")]
1819
public string PiResource { get; set; } = "Payments";
1920

2021
private Resources resources;
21-
public Resources Resource {
22+
public Resources Resource
23+
{
2224
get
2325
{
2426
var _ = PiResource.TryParse<Resources>();
@@ -90,6 +92,10 @@ public DimensionsEnum Dimensions
9092
public string PiBackColor { get; set; }
9193
public Color BackColor => GraphicsTools.ColorFromHex(PiBackColor);
9294

95+
[JsonProperty(PropertyName = "userTokenName")]
96+
public string PiUserTokenName { get; set; }
97+
public string UserTokenName => PiUserTokenName;
98+
9399
public ValueTypes ValueType { get; set; }
94100

95101
public static PluginSettings CreateDefaultSettings()
@@ -101,6 +107,7 @@ public static PluginSettings CreateDefaultSettings()
101107
instance.PiDimensions = String.Empty;
102108
instance.PiFrontColor = "#FFFFFF";
103109
instance.PiBackColor = String.Empty;
110+
instance.PiUserTokenName = "user";
104111
instance.ValueType = ValueTypes.String;
105112
return instance;
106113
}

src/GoogleAPIs/AdSenseManagement/PluginAction.cs

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.ComponentModel;
34
using System.Drawing;
45
using System.IO;
56
using System.Threading.Tasks;
@@ -19,7 +20,7 @@ public class PluginAction : KeypadBase
1920
{
2021
Item item;
2122
PluginSettings pluginSettings;
22-
DataBinder apiAction;
23+
DataBinder dataBinder;
2324

2425
public PluginAction(ISDConnection connection, InitialPayload payload) : base(connection, payload)
2526
{
@@ -34,8 +35,9 @@ public PluginAction(ISDConnection connection, InitialPayload payload) : base(con
3435
Connection.OnPropertyInspectorDidDisappear += Connection_OnPropertyInspectorDidDisappear;
3536
Connection.OnSendToPlugin += Connection_OnSendToPlugin;
3637
Connection.OnTitleParametersDidChange += Connection_OnTitleParametersDidChange;
38+
pluginSettings.PropertyChanged += PropertyChanged;
3739
}
38-
40+
#region Event
3941
/// <summary>
4042
/// 제목이 변경되거나 스트림독에 플러그인이 나타날 때 호출됩니다.titleParametersDidChange
4143
/// 하드웨어 기준.
@@ -45,15 +47,25 @@ public PluginAction(ISDConnection connection, InitialPayload payload) : base(con
4547
private async void Connection_OnTitleParametersDidChange(object sender, SDEventReceivedEventArgs<BarRaider.SdTools.Events.TitleParametersDidChange> e)
4648
{
4749
Logger.Instance.LogMessage(TracingLevel.INFO, "OnTitleParametersDidChange Event Handled");
50+
//Tools.AutoPopulateSettings(pluginSettings, e.Event.Payload.Settings);
4851

49-
if (!GoogleAuth.CredentialIsExist())
52+
if (!GoogleAuth.CredentialIsExist(pluginSettings.UserTokenName))
5053
{
5154
await DisplayInitialAsync();
5255
}
5356
else
5457
{
58+
//TODO 자동 갱신 or 수동 갱신
5559
await DisplayBusyAsync();
5660
await UpdateApiDataAsync();
61+
//if (!CheckExistData())
62+
//{
63+
// await DisplayInitialAsync();
64+
//}
65+
//else
66+
//{
67+
// await DisplayPreValueAsync();
68+
//}
5769
}
5870
}
5971

@@ -129,7 +141,12 @@ private void Connection_OnApplicationDidLaunch(object sender, SDEventReceivedEve
129141
{
130142
Logger.Instance.LogMessage(TracingLevel.INFO, "OnApplicationDidLaunch Event Handled");
131143
}
132-
144+
private void PropertyChanged(object sender, PropertyChangedEventArgs e)
145+
{
146+
Logger.Instance.LogMessage(TracingLevel.INFO, $"{e.PropertyName} Property Changed");
147+
}
148+
#endregion
149+
#region Steam Dock
133150
/// <summary>
134151
/// 스트림독에 플러그인이 표시되지 않으면 호출됩니다.
135152
/// </summary>
@@ -175,16 +192,31 @@ public async override void ReceivedSettings(ReceivedSettingsPayload payload)
175192
Logger.Instance.LogMessage(TracingLevel.INFO, "ReceivedSettings called");
176193

177194
Tools.AutoPopulateSettings(pluginSettings, payload.Settings);
195+
await SaveSettingsAsync(); // 스트림독으로 설정 업로드
178196

179-
await SaveSettingsAsync();
180-
await DisplayInitialAsync();
197+
if (!GoogleAuth.CredentialIsExist(pluginSettings.UserTokenName))
198+
{
199+
item.Init();
200+
dataBinder = null;
201+
await DisplayInitialAsync();
202+
}
203+
else if (CheckExistData())
204+
{
205+
await DisplayBusyAsync();
206+
await UpdateApiDataAsync();
207+
}
208+
else
209+
{
210+
await DisplayInitialAsync();
211+
}
181212
}
182213

183214
public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload)
184215
{
185216
Logger.Instance.LogMessage(TracingLevel.INFO, "ReceivedGlobalSettings called");
217+
Tools.AutoPopulateSettings(pluginSettings, payload.Settings);
186218
}
187-
219+
#endregion
188220
#region Private Methods
189221
/// <summary>
190222
/// 설정 값을 스트림독으로 전달합니다.
@@ -217,21 +249,23 @@ private async Task DisplayInitialAsync()
217249
{
218250
try
219251
{
220-
221-
if (!CheckExistData())
222-
{
223-
#if DEBUG
224-
Logger.Instance.LogMessage(TracingLevel.INFO, "기존 데이터 없음.");
225-
#endif
226-
item.DisplayValues.OnlyOne("Press Key...");
227-
}
228-
else
229-
{
252+
item.DisplayValues.OnlyOne("Press Key...");
230253
#if DEBUG
231-
Logger.Instance.LogMessage(TracingLevel.INFO, "기존 데이터 발견.");
254+
Logger.Instance.LogMessage(TracingLevel.INFO, "DisplayInitialAsync: 스트림독으로 이미지 전송 중...");
232255
#endif
233-
UpdateValues();
234-
}
256+
await Connection.SetImageAsync(UpdateKeyImage(item, true)); // 초기 이미지 출력
257+
}
258+
catch (Exception ex)
259+
{
260+
Logger.Instance.LogMessage(TracingLevel.ERROR, ex.Message);
261+
Logger.Instance.LogMessage(TracingLevel.ERROR, ex.StackTrace);
262+
}
263+
}
264+
private async Task DisplayPreValueAsync()
265+
{
266+
try
267+
{
268+
UpdateValues();
235269
#if DEBUG
236270
Logger.Instance.LogMessage(TracingLevel.INFO, "DisplayInitialAsync: 스트림독으로 이미지 전송 중...");
237271
#endif
@@ -345,7 +379,7 @@ private Bitmap UpdateKeyImage(Item item, bool initial = false)
345379
/// <returns></returns>
346380
private DataBinder GetApiInstance()
347381
{
348-
return apiAction ?? new DataBinder(pluginSettings, item);
382+
return dataBinder ?? new DataBinder(pluginSettings, item);
349383
}
350384
#endregion
351385
}

0 commit comments

Comments
 (0)