1 module oauth_page; 2 3 import std.typecons; 4 import std.process; 5 6 import awebview.wrapper; 7 import awebview.gui.html; 8 import awebview.gui.widgets.button; 9 import awebview.gui.widgets.text; 10 import awebview.gui.application; 11 import awebview.gui.activity; 12 13 import graphite.twitter; 14 15 import carbon.functional; 16 17 18 class OAuthPage : TemplateHTMLPage!(import(`oauth_page.html`)) 19 { 20 private 21 alias NormalButton = InputButton!(["class": "btn btn-xs btn-primary"]); 22 23 24 this() 25 { 26 super("oauthPage"); 27 28 this ~= new InputText!()("iptCnsKey"); 29 this ~= new InputText!()("iptCnsSct"); 30 31 this ~= new NormalButton("btnOpenBrowser").passTo!((a){ 32 a.onClick.connect!"onClickOpenBrowser"(this); 33 a.staticProps["value"] = "ブラウザで開く"; 34 }); 35 36 this ~= new NormalButton("btnDoOAuth").passTo!((a){ 37 a.onClick.connect!"onClickDoOAuth"(this); 38 a.staticProps["value"] = "認証"; 39 }); 40 41 this ~= new InputText!()("iptPinCode"); 42 } 43 44 45 void onClickOpenBrowser(FiredContext ctx, WeakRef!(const(JSArrayCpp)) args) 46 { 47 auto cnsKey = elements["iptCnsKey"].to!ITextInput.text(), 48 cnsSct = elements["iptCnsSct"].to!ITextInput.text(); 49 50 if(_twTkn.isNull && cnsKey.length && cnsSct.length){ 51 auto cnsTkn = ConsumerToken(cnsKey, cnsSct); 52 _twTkn = Twitter(Twitter.oauth.requestToken(cnsTkn, null)); 53 54 auto app = application.to!SDLApplication; 55 with(app.newFactoryOf!SDLActivity(WebPreferences.recommended)){ 56 id = "oauthWebPageActivity"; 57 width = 600; 58 height = 400; 59 title = "Twitter OAuth"; 60 61 app.addActivity(newInstance.passTo!((a){ 62 a.load(new WebPage("oauthWebPage", _twTkn.callAPI!"oauth.authorizeURL"())); 63 })); 64 } 65 } 66 } 67 68 69 override 70 void onUpdate() 71 { 72 if(auto pTwiPage = "oauthWebPageActivity" in activity.children) 73 { 74 if((*pTwiPage).querySelectorAll("#code-desc")["length"].get!uint){ 75 string str = (*pTwiPage)[$("code")]["innerHTML"].to!string; 76 elements["iptPinCode"].to!ITextOutput.text = str; 77 activity.children["oauthWebPageActivity"].close(); 78 onClickDoOAuthImpl(); 79 } 80 } 81 } 82 83 84 void onClickDoOAuth(FiredContext ctx, WeakRef!(const(JSArrayCpp)) args) 85 { 86 onClickDoOAuthImpl(); 87 } 88 89 90 void onClickDoOAuthImpl() 91 { 92 auto pinCode = elements["iptPinCode"].to!ITextInput.text(); 93 if(!_twTkn.isNull && pinCode.length){ 94 _twTkn = Twitter(_twTkn.callAPI!"oauth.accessToken"(pinCode)); 95 } 96 97 elements["btnOpenBrowser"]["disabled"] = true; 98 elements["btnDoOAuth"]["disabled"] = true; 99 activity.load("mainPage"); 100 } 101 102 103 Nullable!Twitter token() 104 { 105 return _twTkn; 106 } 107 108 109 private: 110 NormalButton _btnOpenBrowser; 111 Nullable!Twitter _twTkn; 112 }