From 18ceab1d012c534622fe7ef61903265ae0af5988 Mon Sep 17 00:00:00 2001 From: Thomas Perez Date: Thu, 23 Mar 2017 13:27:31 +0100 Subject: [PATCH] Alpha version --- .gitignore | 3 + application.go | 136 ++++++++++++++++++++++++++++++++++ mac.json | 41 +++++++++++ main.go | 53 ++++++++++++++ menu.go | 55 ++++++++++++++ notifications.go | 56 ++++++++++++++ resources/css/hello.css | 125 +++++++++++++++++++++++++++++++ resources/css/hello.css.map | 7 ++ resources/folder.png | Bin 0 -> 1231 bytes resources/logo2.png | Bin 0 -> 8264 bytes resources/logo3.png | Bin 0 -> 8264 bytes resources/scss/hello.scss | 39 ++++++++++ resources/star.png | Bin 0 -> 11682 bytes resources/top.png | Bin 0 -> 3730 bytes system.go | 30 ++++++++ updemia.go | 142 ++++++++++++++++++++++++++++++++++++ 16 files changed, 687 insertions(+) create mode 100644 .gitignore create mode 100755 application.go create mode 100755 mac.json create mode 100755 main.go create mode 100755 menu.go create mode 100644 notifications.go create mode 100755 resources/css/hello.css create mode 100755 resources/css/hello.css.map create mode 100644 resources/folder.png create mode 100644 resources/logo2.png create mode 100644 resources/logo3.png create mode 100755 resources/scss/hello.scss create mode 100755 resources/star.png create mode 100644 resources/top.png create mode 100644 system.go create mode 100644 updemia.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d7a107 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +client-log.log +.DS_STORE +*.zip \ No newline at end of file diff --git a/application.go b/application.go new file mode 100755 index 0000000..7e75e4e --- /dev/null +++ b/application.go @@ -0,0 +1,136 @@ +package main + +import ( + "crypto/md5" + "encoding/hex" + "encoding/json" + "fmt" + "github.com/murlokswarm/app" + "github.com/sadlil/go-trigger" + "log" + "net/http" +) + +var updemiaUser *Updemia + +type Updemia struct { + Email string + Passphrase string + Hash string + Imgs []UpdemiaImg +} + +type UpdemiaImg struct { + Key string + Url string + Img string +} + +type ImgsResponse struct { + Collection []UpdemiaImg +} + +func (h *Updemia) Render() string { + return ` +
+ {{if .Hash}} +
+ + +
+
+ +
+
+
+ {{ range $index, $element := .Imgs }} +
+ +
+ {{ end }} +
+
+ {{else}} +
+ + +

+ Hello, you +

+
+ + + + +
+
+ {{end}} +
+ ` +} + +func (h *Updemia) OnUserLogout(arg app.ChangeArg) { + h.Hash = "" + app.Render(updemiaUser) +} + +func (h *Updemia) OnUserLog(arg app.ChangeArg) { + + if len(h.Email) > 0 { + hash := md5.Sum([]byte(h.Email)) + h.Hash = hex.EncodeToString(hash[:]) + + h.updateImgs() + updemiaUser = h + + // update screenshot capture + updateScreencaptureDirectory(getDestinationPath()) + + // start watching directory + go watchUploadFolder() + } + + app.Render(h) + + trigger.On("user-newfile-success", func() { + h.updateImgs() + app.Render(updemiaUser) + }) +} + +func (h *Updemia) OnOpenFolder(arg app.ChangeArg) { + openDirectory(getDestinationPath()) +} + +func (h *Updemia) updateImgs() { + url := fmt.Sprintf("http://www.updemia.com/api/v1/get?hash=%s", h.Hash) + req, _ := http.NewRequest("GET", url, nil) + client := &http.Client{} + resp, _ := client.Do(req) + defer resp.Body.Close() + + keys := make([]UpdemiaImg, 0) + if err := json.NewDecoder(resp.Body).Decode(&keys); err != nil { + log.Println(err) + } + + h.Imgs = keys +} + +func (h *Updemia) OnContextMenu() { + ctxmenu := app.NewContextMenu() + ctxmenu.Mount(&AppMainMenu{}) +} + +func init() { + app.RegisterComponent(&Updemia{}) +} diff --git a/mac.json b/mac.json new file mode 100755 index 0000000..7307c16 --- /dev/null +++ b/mac.json @@ -0,0 +1,41 @@ +{ + "name": "Updemia", + "id": "com.updemia.client", + "version": "1.0", + "build-number": 1, + "icon": "logo2.png", + "dev-region": "en", + "deployment-target": "10.12", + "copyright": "Copyright © 2017 scullwm. All rights reserved", + "role": "None", + "category": "", + "sandbox": true, + "capabilities": { + "network": { + "in": false, + "out": true + }, + "hardware": { + "camera": false, + "microphone": false, + "usb": false, + "printing": false, + "bluetooth": false + }, + "app-data": { + "contacts": false, + "location": false, + "calendar": false + }, + "file-access": { + "user-selected": "read-write", + "downloads": "read-write", + "pictures": "read-write", + "music": "read-write", + "movies": "read-write" + } + }, + "store": false, + "sign-id": "", + "supported-files": [] +} diff --git a/main.go b/main.go new file mode 100755 index 0000000..296d564 --- /dev/null +++ b/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "github.com/murlokswarm/app" + _ "github.com/murlokswarm/mac" +) + +var ( + win app.Contexter +) + +func main() { + app.OnLaunch = func() { + appMenu := &AppMainMenu{} + app.MenuBar().Mount(appMenu) + + appMenuDock := &AppMainMenu{} + app.Dock().Mount(appMenuDock) + + win = newMainWindow() + } + + app.OnReopen = func(hasVisibleWindow bool) { + if win != nil { + return + } + + win = newMainWindow() + } + + defer app.Run() +} + +func newMainWindow() app.Contexter { + // Creates a window context. + win := app.NewWindow(app.Window{ + Title: "Updemia - Client", + Width: 320, + Height: 720, + MinWidth: 320, + MinHeight: 720, + MaxWidth: 320, + TitlebarHidden: true, + OnClose: func() bool { + win = nil + return true + }, + }) + + hello := &Updemia{} // Creates a Hello component. + win.Mount(hello) // Mounts the Hello component into the window context. + return win +} diff --git a/menu.go b/menu.go new file mode 100755 index 0000000..3cbf4a0 --- /dev/null +++ b/menu.go @@ -0,0 +1,55 @@ +package main + +import ( + "github.com/murlokswarm/app" + "github.com/murlokswarm/log" +) + +// AppMainMenu implements app.Componer interface. +type AppMainMenu struct { + CustomTitle string + Disabled bool +} + +// Render returns the HTML markup that describes the appearance of the +// component. +// In this case, the component will be mounted into a menu context. +// This restrict the markup to a compositon of menu and menuitem. +func (m *AppMainMenu) Render() string { + return ` + + + + + + + + ` +} + +// OnCustomMenuClick is the handler called when an onclick event occurs in a menuitem. +func (m *AppMainMenu) OnCustomMenuClick() { + log.Info("OnCustomMenuClick") +} + +// WindowMenu implements app.Componer interface. +// It's another component which will be nested inside the AppMenu component. +type WindowMenu struct { +} + +func (m *WindowMenu) Render() string { + return ` + + + + ` +} + +func init() { + app.RegisterComponent(&AppMainMenu{}) + app.RegisterComponent(&WindowMenu{}) +} diff --git a/notifications.go b/notifications.go new file mode 100644 index 0000000..0386cb2 --- /dev/null +++ b/notifications.go @@ -0,0 +1,56 @@ +package main + +import ( + "github.com/deckarep/gosx-notifier" + "github.com/sadlil/go-trigger" + "io" + "log" + "net/http" + "os" +) + +const userSuccess string = "Upload complete" +const userFail string = "Upload fail" +const notifTitle string = "On updemia.com" +const distantLogo string = "http://www.updemia.com/images/logo.png" +const localLogo string = "/tmp/m1UIjW1.png" + +func notifyUserSuccess(url string) { + note := gosxnotifier.NewNotification(userSuccess) + note.AppIcon = localLogo + note.Title = notifTitle + note.Link = url + note.Group = "com.unique.updemia.identifier" + err := note.Push() + + if err != nil { + log.Println("notification error") + } + + trigger.Fire("user-newfile-success") +} + +func notifyUserFail() { + note := gosxnotifier.NewNotification(userFail) + note.AppIcon = localLogo + note.Title = notifTitle + note.Group = "com.unique.updemia.identifier" + err := note.Push() + + if err != nil { + log.Println("notification error") + } +} + +func saveNotificationLogo() { + img, _ := os.Create(localLogo) + defer img.Close() + + resp, _ := http.Get(distantLogo) + defer resp.Body.Close() + + _, err := io.Copy(img, resp.Body) + if err != nil { + log.Println("Error getting logo") + } +} diff --git a/resources/css/hello.css b/resources/css/hello.css new file mode 100755 index 0000000..9fdf737 --- /dev/null +++ b/resources/css/hello.css @@ -0,0 +1,125 @@ +body { + background-image: url("../top.png"); + // background-size: cover; + background-position: -50px 0px; + background-color:white; + background-repeat: repeat-x; + color: black; + overflow: hidden; +} + +.WindowLayout { + position: fixed; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.HelloBox { + padding: 20pt; +} + +.center { + text-align: center; +} + + +.btn { + border-radius: 4px; + border: 1px solid silver; + width: 100%; + padding: 5pt; +} + +h1 { + font-weight: 300; } + +input { + width: 300px; + padding: 5pt; + border: 2px solid silver; + outline: none; + font-size: 14px; + background: transparent; + color: black; +} + + +div.Updemia { + position:fixed; + top:40px; + left:0; + margin-bottom: 20px; +} + +div.Updemia img { + float: left !important; + margin-left: 10px; + width: 50px; + height: 50px; + line-height: 36px; +} + + +div.Gravatar { + position:fixed; + top:40px; + right:0; + margin-bottom: 20px; +} + +div.Gravatar img { + border-radius: 50%; + float: left !important; + margin-right: 10px; + width: 50px; + height: 50px; + line-height: 36px; +} + +// * { +// border:1px solid red; +// } + + +.listMedias { + margin-top:0px; + min-width: 300px; + max-width: 300px; + width: 320px; + min-height:500px; + height:100%; + overflow-y: auto; + overflow-x: none; + position:fixed; + left:0px; + top:95px; + border-bottom:1px solid green; +} + +.media { + width:100%; + text-align: center; + height:120px; + // display: inline-block; +} +.media a { + display:block; + margin:auto; + border: 1px solid #ddd; + border-radius: 4px; + padding: 4px; + max-height: 100px; + max-width: 250px; + min-height: 100px; + min-width: 250px; + background-size: cover; + background-position: center; +} + +input[type=text]:focus { + border-left-color: deepskyblue; } + +/*# sourceMappingURL=hello.css.map */ diff --git a/resources/css/hello.css.map b/resources/css/hello.css.map new file mode 100755 index 0000000..0e2f9d4 --- /dev/null +++ b/resources/css/hello.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA,IAAK;EACD,gBAAgB,EAAE,iBAAiB;EACnC,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,MAAM;EAC3B,KAAK,EAAE,KAAK;EACZ,QAAQ,EAAE,MAAM;;AAGpB,aAAc;EACV,QAAQ,EAAE,KAAK;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;EACvB,WAAW,EAAE,MAAM;;AAGvB,SAAU;EACN,OAAO,EAAE,IAAI;;AAGjB,EAAG;EACC,WAAW,EAAE,GAAG;;AAGpB,KAAM;EACF,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,gBAAgB;EAC7B,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,WAAW;EACvB,KAAK,EAAE,KAAK;;AAGhB,WAAY;EACR,iBAAiB,EAAE,WAAW", +"sources": ["../scss/hello.scss"], +"names": [], +"file": "hello.css" +} \ No newline at end of file diff --git a/resources/folder.png b/resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..a81e27b7ff809bd05f1c84844622eac2423ef0a8 GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^4M1GM!3HF){{Pw!q*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)8VMc~ob0mOj3O!vMLn`LHy?s7ACROCv$LDjbXIjrZ)9Y!Sys3a`VW)!B(I3g$ zp3<{h6*%%-H*V8=eJJ%m%SI=0&m*oEr|RA5bmA$=73@Ch%ALC~FUzGj`SMJa;y7{N zElXM?CtKvJJ^#6e>GQpU2Y=7~op_RC+s}8K!_}QU{1|66MuvuZ-@aZlY3ACMuXGu_ zr4HSBA{`&sX?Z?TIodwv@1L)KvXUR$2%OUhN#@%sY|J96b7j`en=7~LT}wV+EWxp1 z=g+TS*N2v9eRIg&6>|GTn&iQInha~q%+8fxe8zmhJ96E(#5an3%scDPPM7CyD+_0;1dbHj9o?PmlO9%jyCoDU;rY~O9^DU_OBBAwIeIl>F!u{|z4u2)X)`W=Puf?yt`_u6>`+maL?Xz>`SEps( zX3Wq#dV+g-!54}Dzp5s5Xk5yX$TaKubc6FxRjuH5{d%VCb=ym8qVwa=E|r*Xcl@mV z2bQNFC3}45H>=s^%3cg(xcdCQ+sljU-%O-R{mj0o$W^~PyY1RGo&^;tB2PCyuAbXz zwdT_g&o6vETVk#oHGKMU`nQol>8u4dWs9D!n#TBr-~Y{Niz}6p($zrOn)uZCwuR@s zy`6Qh+kA<1$e-n0so+{4FZWZfb=8{^ozg~uhGSL2TX(;X__w&P`fG1}yh--I&*cn) z3#>w%QWtzUu$^_q?M{Z)nkFYZ$J7lCPw&5f_}scYad!UiJJ%L{oajD5^mcXGl6Rq! zZ(J46KK%98UNGmg98mM4XV#NMs{_`GFf!bl{p{WRZzrdoO3=S#BB;y1WY4o|6^F_N z8n^CG@3-Z0y%hhd@mckc!gb-THA<(R*X(y`{V)0^l7oZiz(#=|dl{~~B=Q`vWP2dP zT+qj8ahzdJGQ&AThUXFu#lt{&d0IrbEsJZ?3T=_?N#`9m-r!|D6!gYWLug`tXvp(3 z0!inc=BB2pb=Ix1vaDzAYQ4c6cs%yP$)EE@7`9xq;C>MFq;Z8aPsEi+r+y!Jmb}0x zcFp2zGfWfaO>aJY`plUI?o0FcDf!oKWMlYrVbS~ZHo~(Wnl$+`ON3tC@_6#4eTJLa p7ML$c4AhCdApU%v-H%`QpI!Q0_-MnKNx%|`!PC{xWt~$(699$#EXn`? literal 0 HcmV?d00001 diff --git a/resources/logo2.png b/resources/logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..acad0ca646e3fe1da4ea36ee30ab883fcfaa51dc GIT binary patch literal 8264 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 JLd*Hq{{lPuja~o% literal 0 HcmV?d00001 diff --git a/resources/top.png b/resources/top.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebd7992eaa8e04664773a7968e8c94cc6884c33 GIT binary patch literal 3730 zcmZu!c{mhm7ax1s$-d24VzSJPeK2DkYnHNP$-a+m#u#SM2o-}+BxJjl3dvGgA|g~6 zWJ_I38H^N_CE0!B-uvBqpXdAD=Q-~=?>WEUIqx~|UvJtOTXQaUF?Ij|z-4KHvZrfK zy2u@4rSEO&lh5gAA+(9f8A}rr&>0*i5FHi(09d5uIkP$D_6n80DCgyO12NhgW0E%% zHJ@7Kacdd#gKm(I8}(#C6q{q}y_q}&&*D`Ql@(>uub6gt0xK%OU#W^(jx*(nHMJ## zp+ZW&-mjVMZ+iq91@K$QP;Y;~(Kz6ZAT7h!n6bdJ_ms6gk0F5l20-%aBDN>?V0d^I z&}VT-h$WnGGkF%Ml=-uE?$Bv0_JXP~Ku(ORQCd*Mu^I`$hDVfwfdFIiu_8*}P%f2$ ztZ8};1VFi`tIxZfPamBp7E|OQDJ=CsfWKm@Y#+eTw6DmuV<0iov0P&13L=S@8qT|m zRo6j~zndT++630_Du1%dXnRKPYEuFFuBuM))w9Y&rtvTm=mLX-W(<^zk*+*sWg5D)=-APnzY$X}txJ9y|SDmq4-q9@G;0qb+xI2QI z@3|9fEv{ZDsh6cDzvuf{bHT-XExJQ0AX45;i58ci50q3`Ot}k^s51n4Gae5^d$Yb_ zOx`?bN!YT}=jVhQGOGcA?-ey6e+$#^;p z?GkI)QDy(ys!8qCUp7A-rW3;%+B4{zUuRa$4XamoLB2~V$)OHg5oI1;zW%}2f9kQ1 zL?=0u)IciRUj))~nw!TOdTQ3Zgo`{eb9iHjr0xW%i z80gNx{DZV!Ht*Ru`?Dr$YatL*TQC+%fkg;U7#!-ZEsyNRX)YC8g5iIO#=KZz&hfbfZ%)Oj^m0ycOPa zZC*0@1g>Dp{G{9rs7d6;GEH5I9_H{&X86I)DSgb?IQW?4un{MpdN*q%YKjjickH;i z?=^op!Cu45Wah$DWh1NW(QnR`GgcZWnA*w&T|aH1fMZ)S+PU`PnjJXB{;Z87P}BVN z-ES2JVkxg~I}CH;<=w~-Q|H@7!&Vz0w~SKL+TXO_Mr@qaB{Nuy`gxlbsL-%ht^ zr(dJqGgdPzbt%@1RWl?khPr6K%O-WF!6k#JjdfZktHk1rp>E+%N~@2y5}pfTI%{W< zTY!T+L)p)KVaH0DwWQOo85Nj< z)yMZleePBP+(PC$-a<t2UbR%s73%+U=aQukQzJ+x}GG7*SQXXz>8H}Acpd_U~|*qK3x zZw@nHB_(mCc(9$l5EyDdQ+)xoeFvAlW?scQeyi_}?QN@yhZVaOHe-5Y+8Sa5#WeHN zw--jw4Oay(2J@hSj-M4{6vG5d`;7B&d2V@-Jm)H_s=%s)s!>M{r+&xmN>8U1X9s(A zXTQqGF`Cf?>7nj;@p=>y88Ut?zR??&gVg?vgxKx53F+cj?w&3>QX^W^xS8-?HJnWo$ zmRf|Ge&#T6&LG7gu&3abs)yf9X!iK#C@nNU82GOJ_P%9m<%#m#M^DZ@uw6`o)Pz3L zvn1U7#y!2>vhSz)Ixce|OGPvuzwCi@9CCx2VQOX~+O*n?NKE^@`-pv&oyCn^E)muQ zR##SWPFwK}(Ge~ZCrgSr=a5LdcZlkKp$=t$B1B8PUV66TdUwUkis|4t?_a`an%`{I ztumcRPiwVo>1E9g%w=#e89g={dw={sVc-U3YCvs3tFYl#n|2e-PQxqEGw5K-crrQs zZ1CCe$d5UJOQAZWk4M&81c&>k6(>Vlol-SJR(wm)9ucH*)`rLizV~5GOA_WHi>kKp z8r+o1`Km`R!jr-q!m}m2AX7DOY6icJ6GvB1%}r!sBoD`Ddh}l>WbY%{xKh)&O}V+a zFY37I;UxPdYxRbUlS_nj$MxD`8Y5|X-?8m0#)LGiD{W+Xt!I3|Y2Iz__r<_3H@`Fv ztlVt9AOCdM>Q{yob2cFRid3c)5b1$jM`p(zECqbcTZ!)Yy3L$%eD8R?JYrL8lSXtV z5_VxEds56cephT8cR`5++%DW&-P_zjt~ad>tr>hiRP4|<6u`=SLiXosmW>OLSyGs9 zGB>iJnS0p6x#C2^B#QamB@w(-el_j#Q#W|Ugj%#VgwB@@1UT2T$+y@P8`Ph?Dkdb} zsJVQ$Il3AAT$(YnK%`!uno#aq4toq?N7dhbXO1K{l1oMRC*`Q+pDh=1OJBjeDH-U@ zd#`P?k-WPQ2q+?Ys*TuBw7d|N9P;wU<*LiS(vs4?^0(%`QW&sn$*C?qj8Aum!z?wVzBMWAXsKe zqe^&UKQ)5dKEJ)H^quD;F{pazbN|MGa{sb$9rJmX+9$?OVglQS zvifH7k;S7N?V4p(2AF}YjNAwFPYst(WaPuISAUN>IHsySg&6P1^X&a5l&8Q8{E}3W)Dw}lh__eEW-te745GY?^9uO*d;zJ z3OC$G6eb9z#l*+YIv>t%%$rY<=_LGj)nBXq3RH!%_Z z!y=+|iAb405V~~x$PJYN{Q<#;B4u1`&VWoXxB!qQL<0ho(PsyNKnR?Fpsqd2>@Pa~ zgp>)!D1ktL5Y!)*tG1^yx;phwsLS37^s>JKk{So-V; z=--3aXHTEChtuCe0*$hBq-(~bhoLWix`6-EN47(b0PhA}11(WTj&MHT