Add local and twkn timelines
authorr <r@freesoftwareextremist.com>
Wed, 25 Dec 2019 04:30:21 +0000 (04:30 +0000)
committerr <r@freesoftwareextremist.com>
Wed, 25 Dec 2019 04:30:21 +0000 (04:30 +0000)
mastodon/status.go
renderer/model.go
service/auth.go
service/logging.go
service/service.go
service/transport.go
templates/error.tmpl
templates/navigation.tmpl
templates/timeline.tmpl

index 9f029d131fd19793985a91bfbd644e433b7db2a7..c36b6cba2e3870407010acab735ec217753d5a4c 100644 (file)
@@ -192,7 +192,7 @@ func (c *Client) GetTimelineHome(ctx context.Context, pg *Pagination) ([]*Status
 func (c *Client) GetTimelinePublic(ctx context.Context, isLocal bool, pg *Pagination) ([]*Status, error) {
        params := url.Values{}
        if isLocal {
-               params.Set("local", "t")
+               params.Set("local", "true")
        }
 
        var statuses []*Status
index 9ec4a9adad6f66a0b8c6db1dbf9d9ec578829cfb..be777f6e83552b87e92bda6c8c6050f11839f1a3 100644 (file)
@@ -18,6 +18,7 @@ func NewNavbarTemplateData(notificationCount int, user *mastodon.Account) *Navba
 }
 
 type TimelinePageTemplateData struct {
+       Title       string
        Statuses    []*mastodon.Status
        HasNext     bool
        NextLink    string
@@ -27,9 +28,10 @@ type TimelinePageTemplateData struct {
        NavbarData  *NavbarTemplateData
 }
 
-func NewTimelinePageTemplateData(statuses []*mastodon.Status, hasNext bool, nextLink string, hasPrev bool,
+func NewTimelinePageTemplateData(title string, statuses []*mastodon.Status, hasNext bool, nextLink string, hasPrev bool,
        prevLink string, postContext model.PostContext, navbarData *NavbarTemplateData) *TimelinePageTemplateData {
        return &TimelinePageTemplateData{
+               Title:       title,
                Statuses:    statuses,
                HasNext:     hasNext,
                NextLink:    nextLink,
index 57ef3d070a60c7dfe17e7dd520c8112175888231..cadb050ebb37fd9fd5ebe12a7e46a6b4c7bb1fb8 100644 (file)
@@ -85,12 +85,12 @@ func (s *authService) ServeSigninPage(ctx context.Context, client io.Writer) (er
 }
 
 func (s *authService) ServeTimelinePage(ctx context.Context, client io.Writer,
-       c *model.Client, maxID string, sinceID string, minID string) (err error) {
+       c *model.Client, timelineType string, maxID string, sinceID string, minID string) (err error) {
        c, err = s.getClient(ctx)
        if err != nil {
                return
        }
-       return s.Service.ServeTimelinePage(ctx, client, c, maxID, sinceID, minID)
+       return s.Service.ServeTimelinePage(ctx, client, c, timelineType, maxID, sinceID, minID)
 }
 
 func (s *authService) ServeThreadPage(ctx context.Context, client io.Writer, c *model.Client, id string, reply bool) (err error) {
index 9848e5422788a12d173050f91e8c760428370bba..87433a435a32c21bf3484e241c747568ba642ef4 100644 (file)
@@ -61,12 +61,12 @@ func (s *loggingService) ServeSigninPage(ctx context.Context, client io.Writer)
 }
 
 func (s *loggingService) ServeTimelinePage(ctx context.Context, client io.Writer,
-       c *model.Client, maxID string, sinceID string, minID string) (err error) {
+       c *model.Client, timelineType string, maxID string, sinceID string, minID string) (err error) {
        defer func(begin time.Time) {
-               s.logger.Printf("method=%v, max_id=%v, since_id=%v, min_id=%v, took=%v, err=%v\n",
-                       "ServeTimelinePage", maxID, sinceID, minID, time.Since(begin), err)
+               s.logger.Printf("method=%v, timeline_type=%v, max_id=%v, since_id=%v, min_id=%v, took=%v, err=%v\n",
+                       "ServeTimelinePage", timelineType, maxID, sinceID, minID, time.Since(begin), err)
        }(time.Now())
-       return s.Service.ServeTimelinePage(ctx, client, c, maxID, sinceID, minID)
+       return s.Service.ServeTimelinePage(ctx, client, c, timelineType, maxID, sinceID, minID)
 }
 
 func (s *loggingService) ServeThreadPage(ctx context.Context, client io.Writer, c *model.Client, id string, reply bool) (err error) {
index 8a262b62edb2a46121584c799f47d117c0dbc9be..7fc27fcb739e1e52c457fad5305364be38405cbf 100644 (file)
@@ -21,6 +21,7 @@ var (
        ErrInvalidArgument = errors.New("invalid argument")
        ErrInvalidToken    = errors.New("invalid token")
        ErrInvalidClient   = errors.New("invalid client")
+       ErrInvalidTimeline = errors.New("invalid timeline")
 )
 
 type Service interface {
@@ -29,7 +30,7 @@ type Service interface {
        GetUserToken(ctx context.Context, sessionID string, c *model.Client, token string) (accessToken string, err error)
        ServeErrorPage(ctx context.Context, client io.Writer, err error)
        ServeSigninPage(ctx context.Context, client io.Writer) (err error)
-       ServeTimelinePage(ctx context.Context, client io.Writer, c *model.Client, maxID string, sinceID string, minID string) (err error)
+       ServeTimelinePage(ctx context.Context, client io.Writer, c *model.Client, timelineType string, maxID string, sinceID string, minID string) (err error)
        ServeThreadPage(ctx context.Context, client io.Writer, c *model.Client, id string, reply bool) (err error)
        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)
@@ -210,7 +211,7 @@ func (svc *service) ServeSigninPage(ctx context.Context, client io.Writer) (err
 }
 
 func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
-       c *model.Client, maxID string, sinceID string, minID string) (err error) {
+       c *model.Client, timelineType string, maxID string, sinceID string, minID string) (err error) {
 
        var hasNext, hasPrev bool
        var nextLink, prevLink string
@@ -221,7 +222,21 @@ func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
                Limit: 20,
        }
 
-       statuses, err := c.GetTimelineHome(ctx, &pg)
+       var statuses []*mastodon.Status
+       var title string
+       switch timelineType {
+       default:
+               return ErrInvalidTimeline
+       case "home":
+               statuses, err = c.GetTimelineHome(ctx, &pg)
+               title = "Timeline"
+       case "local":
+               statuses, err = c.GetTimelinePublic(ctx, true, &pg)
+               title = "Local Timeline"
+       case "twkn":
+               statuses, err = c.GetTimelinePublic(ctx, false, &pg)
+               title = "The Whole Known Network"
+       }
        if err != nil {
                return err
        }
@@ -261,7 +276,7 @@ func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
                return
        }
 
-       data := renderer.NewTimelinePageTemplateData(statuses, hasNext, nextLink, hasPrev, prevLink, postContext, navbarData)
+       data := renderer.NewTimelinePageTemplateData(title, statuses, hasNext, nextLink, hasPrev, prevLink, postContext, navbarData)
        err = svc.renderer.RenderTimelinePage(ctx, client, data)
        if err != nil {
                return
index 437d32ff6f297948dded4a8118fd7e6490b74fe8..438b39d05f805131324754b1a9efddeee852aee0 100644 (file)
@@ -26,7 +26,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
 
                sessionID, _ := req.Cookie("session_id")
                if sessionID != nil && len(sessionID.Value) > 0 {
-                       location = "/timeline"
+                       location = "/timeline/home"
                }
 
                w.Header().Add("Location", location)
@@ -63,18 +63,24 @@ func NewHandler(s Service, staticDir string) http.Handler {
                        return
                }
 
-               w.Header().Add("Location", "/timeline")
+               w.Header().Add("Location", "/timeline/home")
                w.WriteHeader(http.StatusFound)
        }).Methods(http.MethodGet)
 
        r.HandleFunc("/timeline", func(w http.ResponseWriter, req *http.Request) {
+               w.Header().Add("Location", "/timeline/home")
+               w.WriteHeader(http.StatusFound)
+       }).Methods(http.MethodGet)
+
+       r.HandleFunc("/timeline/{type}", func(w http.ResponseWriter, req *http.Request) {
                ctx := getContextWithSession(context.Background(), req)
 
+               timelineType, _ := mux.Vars(req)["type"]
                maxID := req.URL.Query().Get("max_id")
                sinceID := req.URL.Query().Get("since_id")
                minID := req.URL.Query().Get("min_id")
 
-               err := s.ServeTimelinePage(ctx, w, nil, maxID, sinceID, minID)
+               err := s.ServeTimelinePage(ctx, w, nil, timelineType, maxID, sinceID, minID)
                if err != nil {
                        s.ServeErrorPage(ctx, w, err)
                        return
@@ -166,7 +172,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
                        return
                }
 
-               location := "/timeline" + "#status-" + id
+               location := "/timeline/home" + "#status-" + id
                if len(replyToID) > 0 {
                        location = "/thread/" + replyToID + "#status-" + id
                }
index 890b5a7f1f4baa8dd7bd19041a727fad57b31d4b..d4bd817fe7ea8aba7d9e0deb7faeb146f03563d9 100644 (file)
@@ -2,7 +2,7 @@
 <div class="page-title"> Error </div>
 <div class="error-text"> {{.}} </div>
 <div>
-<a href="/timeline">Home</a>
+<a href="/timeline/home">Home</a>
 <a href="/signin">Sign In</a>
 </div>
 {{template "footer.tmpl"}}
index 0e745a2446ad4afd60e7bb00724a1dd8025a8db2..bd97d2dfbc6e4f050b1f55c2945855215c9649d9 100644 (file)
@@ -1,6 +1,6 @@
 <div class="user-info">
        <div class="user-info-img-container">
-               <a class="img-link" href="/timeline" title="home">
+               <a class="img-link" href="/timeline/home" title="home">
                        <img class="user-info-img" src="{{.User.AvatarStatic}}" alt="profile-avatar" />
                </a>
        </div>
                        </a>
                </div>
                <div>
-                       <a class="nav-link" href="/timeline">home</a>
+                       <a class="nav-link" href="/timeline/home">home</a>
                        <a class="nav-link" href="/notifications">notifications{{if gt .NotificationCount 0}}({{.NotificationCount}}){{end}}</a>
+                       <a class="nav-link" href="/timeline/local">local</a>
+                       <a class="nav-link" href="/timeline/twkn">twkn</a>
                        <a class="nav-link" href="/about">about</a>
                </div>
                <div>
index 6280e653a4fec5f14cc3384205a6cc3746d7f466..5bff2d087aa7d415433023878c9e3d994b5b989b 100644 (file)
@@ -1,6 +1,6 @@
 {{template "header.tmpl"}}
 {{template "navigation.tmpl" .NavbarData}}
-<div class="page-title"> Timeline </div>
+<div class="page-title"> {{.Title}} </div>
 
 
 {{template "postform.tmpl" .PostContext}}