Add emojis page
authorr <r@freesoftwareextremist.com>
Sun, 22 Dec 2019 18:10:42 +0000 (18:10 +0000)
committerr <r@freesoftwareextremist.com>
Sun, 22 Dec 2019 18:10:42 +0000 (18:10 +0000)
mastodon/instance.go
renderer/model.go
renderer/renderer.go
service/auth.go
service/logging.go
service/service.go
service/transport.go
static/main.css
templates/emoji.tmpl [new file with mode: 0644]

index 32174506ce152c1405a815e86ccb38e28eb9b628..1dc2c8e539e15a73cb8b5dc013317dea9d8aee44 100644 (file)
@@ -63,3 +63,13 @@ func (c *Client) GetInstancePeers(ctx context.Context) ([]string, error) {
        }
        return peers, nil
 }
+
+// GetInstanceEmojis return instance emojis.
+func (c *Client) GetInstanceEmojis(ctx context.Context) ([]*Emoji, error) {
+       var emojis []*Emoji
+       err := c.doAPI(ctx, http.MethodGet, "/api/v1/custom_emojis", nil, &emojis, nil)
+       if err != nil {
+               return nil, err
+       }
+       return emojis, nil
+}
index 9380b7fb40244af07eef8a2d83676589d1666eab..2719dbe680d55f40ed316bf55f714cf9caa8316b 100644 (file)
@@ -97,3 +97,15 @@ func NewAboutPageTemplateData(navbarData *NavbarTemplateData) *AboutPageTemplate
                NavbarData: navbarData,
        }
 }
+
+type EmojiPageTemplateData struct {
+       NavbarData *NavbarTemplateData
+       Emojis     []*mastodon.Emoji
+}
+
+func NewEmojiPageTemplateData(navbarData *NavbarTemplateData, emojis []*mastodon.Emoji) *EmojiPageTemplateData {
+       return &EmojiPageTemplateData{
+               NavbarData: navbarData,
+               Emojis:     emojis,
+       }
+}
index 8009d991d334a3ce9dcff7d3aea80130008a4b4d..4415b0b64585b38713a17dc6f7a8bec186b1763c 100644 (file)
@@ -20,6 +20,7 @@ type Renderer interface {
        RenderNotificationPage(ctx context.Context, writer io.Writer, data *NotificationPageTemplateData) (err error)
        RenderUserPage(ctx context.Context, writer io.Writer, data *UserPageTemplateData) (err error)
        RenderAboutPage(ctx context.Context, writer io.Writer, data *AboutPageTemplateData) (err error)
+       RenderEmojiPage(ctx context.Context, writer io.Writer, data *EmojiPageTemplateData) (err error)
 }
 
 type renderer struct {
@@ -76,6 +77,10 @@ func (r *renderer) RenderAboutPage(ctx context.Context, writer io.Writer, data *
        return r.template.ExecuteTemplate(writer, "about.tmpl", data)
 }
 
+func (r *renderer) RenderEmojiPage(ctx context.Context, writer io.Writer, data *EmojiPageTemplateData) (err error) {
+       return r.template.ExecuteTemplate(writer, "emoji.tmpl", data)
+}
+
 func EmojiFilter(content string, emojis []mastodon.Emoji) string {
        var replacements []string
        for _, e := range emojis {
index 1b2700ce5a3cc62f07c12abeb69af3f0951a0a5c..57ef3d070a60c7dfe17e7dd520c8112175888231 100644 (file)
@@ -125,6 +125,14 @@ func (s *authService) ServeAboutPage(ctx context.Context, client io.Writer, c *m
        return s.Service.ServeAboutPage(ctx, client, c)
 }
 
+func (s *authService) ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
+       c, err = s.getClient(ctx)
+       if err != nil {
+               return
+       }
+       return s.Service.ServeEmojiPage(ctx, client, c)
+}
+
 func (s *authService) Like(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
        c, err = s.getClient(ctx)
        if err != nil {
index 444584e877b50d864c68e095692b40e0dc3b66cf..9848e5422788a12d173050f91e8c760428370bba 100644 (file)
@@ -101,6 +101,14 @@ func (s *loggingService) ServeAboutPage(ctx context.Context, client io.Writer, c
        return s.Service.ServeAboutPage(ctx, client, c)
 }
 
+func (s *loggingService) ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
+       defer func(begin time.Time) {
+               s.logger.Printf("method=%v, took=%v, err=%v\n",
+                       "ServeEmojiPage", time.Since(begin), err)
+       }(time.Now())
+       return s.Service.ServeEmojiPage(ctx, client, c)
+}
+
 func (s *loggingService) Like(ctx context.Context, client io.Writer, c *model.Client, id string) (err error) {
        defer func(begin time.Time) {
                s.logger.Printf("method=%v, id=%v, took=%v, err=%v\n",
index ad47408f88ef9f22fd1f3300633fd981b0c7b242..27ee6bf774af23ee03420fc95972a98d57c3287f 100644 (file)
@@ -34,6 +34,7 @@ type Service interface {
        ServeNotificationPage(ctx context.Context, client io.Writer, c *model.Client, maxID string, minID string) (err error)
        ServeUserPage(ctx context.Context, client io.Writer, c *model.Client, id string, maxID string, minID string) (err error)
        ServeAboutPage(ctx context.Context, client io.Writer, c *model.Client) (err error)
+       ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error)
        Like(ctx context.Context, client io.Writer, c *model.Client, id string) (err error)
        UnLike(ctx context.Context, client io.Writer, c *model.Client, id string) (err error)
        Retweet(ctx context.Context, client io.Writer, c *model.Client, id string) (err error)
@@ -444,6 +445,26 @@ func (svc *service) ServeAboutPage(ctx context.Context, client io.Writer, c *mod
        return
 }
 
+func (svc *service) ServeEmojiPage(ctx context.Context, client io.Writer, c *model.Client) (err error) {
+       navbarData, err := svc.getNavbarTemplateData(ctx, client, c)
+       if err != nil {
+               return
+       }
+
+       emojis, err := c.GetInstanceEmojis(ctx)
+       if err != nil {
+               return
+       }
+
+       data := renderer.NewEmojiPageTemplateData(navbarData, emojis)
+       err = svc.renderer.RenderEmojiPage(ctx, client, data)
+       if err != nil {
+               return
+       }
+
+       return
+}
+
 func (svc *service) getNavbarTemplateData(ctx context.Context, client io.Writer, c *model.Client) (data *renderer.NavbarTemplateData, err error) {
        notifications, err := c.GetNotifications(ctx, nil)
        if err != nil {
index e3ec113cc75a657c071a3bdb99be1ac90f3a0be9..437d32ff6f297948dded4a8118fd7e6490b74fe8 100644 (file)
@@ -241,6 +241,16 @@ func NewHandler(s Service, staticDir string) http.Handler {
                }
        }).Methods(http.MethodGet)
 
+       r.HandleFunc("/emojis", func(w http.ResponseWriter, req *http.Request) {
+               ctx := getContextWithSession(context.Background(), req)
+
+               err := s.ServeEmojiPage(ctx, w, nil)
+               if err != nil {
+                       s.ServeErrorPage(ctx, w, err)
+                       return
+               }
+       }).Methods(http.MethodGet)
+
        r.HandleFunc("/signout", func(w http.ResponseWriter, req *http.Request) {
                // TODO remove session from database
                w.Header().Add("Set-Cookie", fmt.Sprintf("session_id=;max-age=0"))
index b4b616b196220e0fe7c5f074807fae931faeca86..f09f5178fac3ae898a41cf0c25349a9023da7550 100644 (file)
 .post-form-field>* {
   vertical-align: middle;
 }
+
+.emoji {
+       min-width: 220px;
+       display: inline-block;
+       margin-bottom: 2px;
+}
+
+.emoji-img {
+       height: 24px;
+       width: 24px;
+       object-fit: contain;
+       vertical-align: middle;
+
+}
+
+.emoji-shortcode {
+       vertical-align: middle;
+       display: inline-block;
+}
diff --git a/templates/emoji.tmpl b/templates/emoji.tmpl
new file mode 100644 (file)
index 0000000..a0cf263
--- /dev/null
@@ -0,0 +1,16 @@
+{{template "header.tmpl"}}
+{{template "navigation.tmpl" .NavbarData}}
+<div class="page-title"> Emojis </div>
+
+<div class="emoji-list-container">
+       {{range .Emojis}}
+       <div class="emoji">
+               <img class="emoji-img" src="{{.URL}}" alt="{{.ShortCode}}" />
+               <div class="emoji-shortcode">:{{.ShortCode}}:</div>
+       </div>
+       {{end}}
+</div>
+
+{{template "footer.tmpl"}}
+
+