Skip to content

Commit a3820f1

Browse files
authored
Merge pull request #10 from seth-shi/feature/optimal
Feature/optimal
2 parents 9159198 + cb7ab40 commit a3820f1

File tree

16 files changed

+200
-58
lines changed

16 files changed

+200
-58
lines changed

.github/workflows/go.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ jobs:
2828
goversion: 1.24
2929
md5sum: false
3030
overwrite: true
31-
executable_compression: upx
3231
asset_name: go-v2ex-${{ matrix.goos }}-${{ matrix.goarch }}
3332
pre_command: export CGO_ENABLED=0
3433
ldflags: -s -w -extldflags -static -X "main.appVersion=${{ env.APP_VERSION }}"

api/api_self.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package api
2+
3+
import (
4+
"context"
5+
6+
tea "github.com/charmbracelet/bubbletea"
7+
"github.com/seth-shi/go-v2ex/g"
8+
"github.com/seth-shi/go-v2ex/response"
9+
)
10+
11+
func (cli *v2exClient) Me(ctx context.Context) tea.Cmd {
12+
return func() tea.Msg {
13+
14+
var res response.MeResponse
15+
_, err := cli.client.R().
16+
SetContext(ctx).
17+
SetResult(&res).
18+
Get("/api/v2/member")
19+
if err != nil {
20+
return err
21+
}
22+
23+
g.Me.Set(res.Result)
24+
25+
return nil
26+
}
27+
}

api/api_v2_token.go

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,30 @@ package api
33
import (
44
"context"
55
"fmt"
6-
"sync"
76

87
tea "github.com/charmbracelet/bubbletea"
98
"github.com/dromara/carbon/v2"
109
"github.com/seth-shi/go-v2ex/response"
1110
)
1211

13-
var (
14-
tokenOnce sync.Once
15-
tokenMsg error
16-
)
17-
1812
func (cli *v2exClient) GetToken(ctx context.Context) tea.Cmd {
1913
return func() tea.Msg {
20-
tokenOnce.Do(
21-
func() {
22-
var res response.V2Token
23-
_, err := cli.client.R().
24-
SetContext(ctx).
25-
SetResult(&res).
26-
Get("/api/v2/token")
27-
28-
if err != nil {
29-
tokenMsg = err
30-
return
31-
}
32-
33-
// 准备过期的话, 发送提醒
34-
expireAt := carbon.CreateFromTimestamp(res.Result.Created + res.Result.Expiration)
35-
if !carbon.Now().AddDays(14).Gte(expireAt) {
36-
return
37-
}
38-
39-
tokenMsg = errorWrapper("令牌", fmt.Errorf("将在%s过期,请注意更换", expireAt.String()))
40-
},
41-
)
42-
43-
return tokenMsg
14+
var res response.V2Token
15+
_, err := cli.client.R().
16+
SetContext(ctx).
17+
SetResult(&res).
18+
Get("/api/v2/token")
19+
20+
if err != nil {
21+
return err
22+
}
23+
24+
// 准备过期的话, 发送提醒
25+
expireAt := carbon.CreateFromTimestamp(res.Result.Created + res.Result.Expiration)
26+
if !carbon.Now().AddDays(14).Gte(expireAt) {
27+
return nil
28+
}
29+
30+
return errorWrapper("令牌", fmt.Errorf("将在%s过期,请注意更换", expireAt.String()))
4431
}
4532
}

g/me.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package g
2+
3+
import (
4+
"github.com/seth-shi/go-v2ex/model"
5+
"github.com/seth-shi/go-v2ex/response"
6+
)
7+
8+
var (
9+
Me = model.
10+
NewSafe(response.MeResult{}, nil)
11+
)

messages/loading.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
var (
1010
lastLoadingId int64
1111
LoadingGetToken = newLoadingKey("获取 token 信息中")
12+
LoadingMe = newLoadingKey("获取个人信息中")
1213
LoadingRequestTopics = newLoadingKey("获取主题中")
1314
LoadingRequestDetail = newLoadingKey("获取内容中")
1415
LoadingRequestReply = newLoadingKey("获取评论中")

pages/detail.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type detailPage struct {
5555
id int64
5656
replyPage int
5757
replyIndex int
58+
opMember response.MemberResult
5859
}
5960

6061
func newDetailPage() detailPage {
@@ -71,6 +72,8 @@ func (m detailPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
7172
cmds []tea.Cmd
7273
)
7374

75+
// 显示是否是 pro && 是否有人
76+
7477
switch msgType := msg.(type) {
7578
case messages.GetDetailRequest:
7679
// 获取内容 + 第一页的评论
@@ -187,21 +190,33 @@ func (m *detailPage) onReplyResult(msgType messages.GetReplyResponse) tea.Cmd {
187190
Width(w - 2).
188191
BorderRight(false).
189192
BorderBottom(false)
193+
me = g.Me.Get()
190194
)
191195

192196
replies.WriteString("\n")
197+
193198
for _, r := range data.Result {
194199
m.replyIndex++
200+
201+
var (
202+
opText string
203+
)
204+
205+
if r.Member.Id == m.opMember.Id {
206+
opText = styles.MemberOp
207+
}
208+
195209
floor := fmt.Sprintf(
196-
"#%d · %s @%s",
210+
"#%d · %s @%s%s",
197211
m.replyIndex,
198212
carbon.CreateFromTimestamp(r.Created),
199-
r.Member.Username,
213+
r.Member.GetUserNameLabel(me.Id),
214+
opText,
200215
)
201216

202217
replies.WriteString(replyTitleStyle.Render(floor))
203218
replies.WriteString("\n")
204-
replies.WriteString(r.GetContent())
219+
replies.WriteString(r.GetContent(w))
205220
replies.WriteString("\n")
206221
}
207222

@@ -295,9 +310,11 @@ func (m *detailPage) renderDetail(detail response.V2DetailResult) tea.Cmd {
295310
w, _ = g.Window.GetSize()
296311
contentWidth = w - 2
297312
content strings.Builder
298-
topicContent = detail.GetContent()
313+
topicContent = detail.GetContent(w)
299314
contentTitleStyle = styles.Border.BorderRight(false).BorderBottom(false)
315+
me = g.Me.Get()
300316
)
317+
m.opMember = detail.Member
301318

302319
content.WriteString(
303320
contentTitleStyle.
@@ -307,7 +324,8 @@ func (m *detailPage) renderDetail(detail response.V2DetailResult) tea.Cmd {
307324
"V2EX > %s %s\n%s · %s · %d 回复\n\n%s\n\n%s",
308325
styles.Bold.Render(detail.Node.Title),
309326
detail.Url,
310-
detail.Member.Username, carbon.CreateFromTimestamp(detail.Created),
327+
detail.Member.GetUserNameLabel(me.Id),
328+
carbon.CreateFromTimestamp(detail.Created),
311329
detail.Replies,
312330
lipgloss.NewStyle().
313331
Bold(true).
@@ -324,7 +342,7 @@ func (m *detailPage) renderDetail(detail response.V2DetailResult) tea.Cmd {
324342

325343
desc := fmt.Sprintf(
326344
"第 %d 条附言 · %s\n%s", i+1, carbon.CreateFromTimestamp(c.Created),
327-
c.GetContent(),
345+
c.GetContent(w),
328346
)
329347
content.WriteString(contentTitleStyle.Width(w).Render(desc))
330348
}

pages/splash.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,20 @@ func (m splashPage) onConfigResult(msg messages.LoadConfigResult) (tea.Model, te
6161
// 去触发对应的地方获取数据
6262
cmds = append(
6363
cmds,
64-
// 先跳转到主题页
65-
commands.Redirect(RouteTopic),
66-
// 获取个人信息
64+
// 获取 token 过期信息
6765
tea.Sequence(
6866
messages.LoadingGetToken.PostStart(),
6967
api.V2ex.GetToken(context.Background()),
7068
messages.LoadingGetToken.PostEnd(),
7169
),
70+
// 获取个人信息
71+
tea.Sequence(
72+
messages.LoadingMe.PostStart(),
73+
api.V2ex.Me(context.Background()),
74+
messages.LoadingMe.PostEnd(),
75+
),
76+
// 先跳转到主题页
77+
commands.Redirect(RouteTopic),
7278
)
7379
return m, tea.Sequence(cmds...)
7480
}

pkg/html.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/charmbracelet/glamour/styles"
1010
"github.com/muesli/termenv"
1111
"github.com/samber/lo"
12-
"github.com/seth-shi/go-v2ex/g"
1312
"golang.org/x/term"
1413
)
1514

@@ -47,11 +46,7 @@ func getRenderer(w int) *glamour.TermRenderer {
4746
return renderer
4847
}
4948

50-
func SafeRenderHtml(input string) string {
51-
52-
var (
53-
w, _ = g.Window.GetSize()
54-
)
49+
func SafeRenderHtml(input string, w int) string {
5550

5651
out, err := getRenderer(w).Render(input)
5752
if err != nil {

pkg/image.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,16 @@ func ProcessURLs(urls []string, width int) map[string]string {
9090
var (
9191
wg sync.WaitGroup
9292
chSemaphore = make(chan struct{}, 5)
93-
chImgRes = make(chan imgRes, len(urls))
93+
chImgRes = make(chan imgRes)
9494
)
95-
for _, l := range urls {
96-
chSemaphore <- struct{}{}
97-
wg.Add(1)
98-
go downloadImageRes(l, chSemaphore, chImgRes, &wg)
99-
}
95+
10096
go func() {
97+
for _, l := range urls {
98+
chSemaphore <- struct{}{}
99+
wg.Add(1)
100+
go downloadImageRes(l, chSemaphore, chImgRes, &wg)
101+
}
102+
101103
wg.Wait()
102104
close(chImgRes)
103105
}()

response/api_me.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package response
2+
3+
type MeResponse struct {
4+
Success bool `json:"success"`
5+
Result MeResult `json:"result"`
6+
}
7+
8+
type MeResult struct {
9+
Id int `json:"id"`
10+
Username string `json:"username"`
11+
Url string `json:"url"`
12+
Website string `json:"website"`
13+
Twitter string `json:"twitter"`
14+
Psn string `json:"psn"`
15+
Github string `json:"github"`
16+
Btc string `json:"btc"`
17+
Location string `json:"location"`
18+
Tagline string `json:"tagline"`
19+
Bio string `json:"bio"`
20+
Created int `json:"created"`
21+
LastModified int `json:"last_modified"`
22+
Pro int `json:"pro"`
23+
}

0 commit comments

Comments
 (0)