mirror of
https://github.com/ChronosX88/yans.git
synced 2024-11-09 15:11:00 +00:00
Implement NEWTHREADS command
This commit is contained in:
parent
75df0d6bdf
commit
9dec53ff13
@ -232,3 +232,9 @@ func (sb *SQLiteBackend) GetNewArticlesSince(timestamp int64) ([]string, error)
|
|||||||
var articleIds []string
|
var articleIds []string
|
||||||
return articleIds, sb.db.Select(&articleIds, "SELECT json_extract(articles.header, '$.Message-Id[0]') FROM articles WHERE created_at > datetime(?, 'unixepoch')", timestamp)
|
return articleIds, sb.db.Select(&articleIds, "SELECT json_extract(articles.header, '$.Message-Id[0]') FROM articles WHERE created_at > datetime(?, 'unixepoch')", timestamp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sb *SQLiteBackend) GetNewThreads(g *models.Group, perPage int, pageNum int) ([]int, error) {
|
||||||
|
var numbers []int
|
||||||
|
|
||||||
|
return numbers, sb.db.Select(&numbers, "SELECT atg.article_number FROM articles INNER JOIN articles_to_groups atg on atg.article_id = articles.id WHERE atg.group_id = ? AND articles.thread IS NULL ORDER BY articles.created_at DESC LIMIT ? OFFSET ?", g.ID, perPage, perPage*pageNum)
|
||||||
|
}
|
||||||
|
@ -22,4 +22,5 @@ type StorageBackend interface {
|
|||||||
GetLastArticleByNum(g *models.Group, a *models.Article) (models.Article, error)
|
GetLastArticleByNum(g *models.Group, a *models.Article) (models.Article, error)
|
||||||
GetNextArticleByNum(g *models.Group, a *models.Article) (models.Article, error)
|
GetNextArticleByNum(g *models.Group, a *models.Article) (models.Article, error)
|
||||||
GetArticlesByRange(g *models.Group, low, high int64) ([]models.Article, error)
|
GetArticlesByRange(g *models.Group, low, high int64) ([]models.Article, error)
|
||||||
|
GetNewThreads(g *models.Group, perPage int, pageNum int) ([]int, error)
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,9 @@ func NewHandler(b backend.StorageBackend, serverDomain, uploadPath string) *Hand
|
|||||||
protocol.CommandNext: h.handleNext,
|
protocol.CommandNext: h.handleNext,
|
||||||
protocol.CommandOver: h.handleOver,
|
protocol.CommandOver: h.handleOver,
|
||||||
protocol.CommandXover: h.handleOver,
|
protocol.CommandXover: h.handleOver,
|
||||||
|
|
||||||
|
// project-specific extensions
|
||||||
|
"NEWTHREADS": h.handleNewThreads,
|
||||||
}
|
}
|
||||||
h.serverDomain = serverDomain
|
h.serverDomain = serverDomain
|
||||||
h.uploadPath = uploadPath
|
h.uploadPath = uploadPath
|
||||||
@ -865,6 +868,42 @@ func (h *Handler) handleOver(s *Session, command string, arguments []string, id
|
|||||||
return dw.Close()
|
return dw.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) handleNewThreads(s *Session, command string, arguments []string, id uint) error {
|
||||||
|
s.tconn.StartResponse(id)
|
||||||
|
defer s.tconn.EndResponse(id)
|
||||||
|
|
||||||
|
if s.currentGroup == nil {
|
||||||
|
return s.tconn.PrintfLine(protocol.NNTPResponse{Code: 412, Message: "no newsgroup selected"}.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arguments) == 0 {
|
||||||
|
return s.tconn.PrintfLine(protocol.ErrSyntaxError.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
perPage, err := strconv.Atoi(arguments[0])
|
||||||
|
if err != nil {
|
||||||
|
return s.tconn.PrintfLine(protocol.ErrSyntaxError.String())
|
||||||
|
}
|
||||||
|
pageNum, err := strconv.Atoi(arguments[1])
|
||||||
|
if err != nil {
|
||||||
|
return s.tconn.PrintfLine(protocol.ErrSyntaxError.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
threadNums, err := h.backend.GetNewThreads(s.currentGroup, perPage, pageNum)
|
||||||
|
if err != nil {
|
||||||
|
if err != sql.ErrNoRows {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dw := s.tconn.DotWriter()
|
||||||
|
dw.Write([]byte(protocol.NNTPResponse{Code: 225, Message: "New thread numbers follows" + protocol.CRLF}.String()))
|
||||||
|
for _, v := range threadNums {
|
||||||
|
dw.Write([]byte(strconv.Itoa(v) + protocol.CRLF))
|
||||||
|
}
|
||||||
|
return dw.Close()
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Handler) Handle(s *Session, message string, id uint) error {
|
func (h *Handler) Handle(s *Session, message string, id uint) error {
|
||||||
splittedMessage := strings.Split(message, " ")
|
splittedMessage := strings.Split(message, " ")
|
||||||
for i, v := range splittedMessage {
|
for i, v := range splittedMessage {
|
||||||
|
Loading…
Reference in New Issue
Block a user