Skip to content

Commit

Permalink
handlers in separate files
Browse files Browse the repository at this point in the history
  • Loading branch information
meehow committed Mar 22, 2022
1 parent d9d8470 commit 11533d6
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 96 deletions.
69 changes: 69 additions & 0 deletions annnounce.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package main

import (
"github.com/gofiber/fiber/v2"
"github.com/jackpal/bencode-go"
)

type AnnounceRequest struct {
InfoHash string `query:"info_hash"`
PeerID string `query:"peer_id"`
IP string `query:"ip"`
Port uint16 `query:"port"`
Uploaded uint `query:"uploaded"`
Downloaded uint `query:"downloaded"`
Left uint `query:"left"`
Numwant uint `query:"numwant"`
Key string `query:"key"`
Compact bool `query:"compact"`
SupportCrypto bool `query:"supportcrypto"`
Event string `query:"event"`
}

func (req *AnnounceRequest) IsSeeding() bool {
return req.Left == 0
}

type AnnounceResponse struct {
Interval int `bencode:"interval"`
Complete int `bencode:"complete"`
Incomplete int `bencode:"incomplete"`
Peers []byte `bencode:"peers"`
PeersIPv6 []byte `bencode:"peers_ipv6"`
}

func announce(c *fiber.Ctx) error {
var req AnnounceRequest
err := c.QueryParser(&req)
if err != nil {
return err
}
req.IP = c.IP()
if req.Numwant == 0 {
req.Numwant = 30
}
switch req.Event {
case "stopped":
DeletePeer(c.Params("room"), req.InfoHash, req.IP, req.Port)
case "completed":
GraduateLeecher(c.Params("room"), req.InfoHash, req.IP, req.Port)
default:
PutPeer(c.Params("room"), req.InfoHash, req.IP, req.Port, req.IsSeeding())
}
peersIPv4, peersIPv6, numSeeders, numLeechers := GetPeers(c.Params("room"), req.InfoHash, req.IP, req.Port, req.IsSeeding(), req.Numwant)
interval := 120
if numSeeders == 0 {
interval /= 2
} else if numLeechers == 0 {
interval *= 2
}
resp := AnnounceResponse{
Interval: interval,
Complete: numSeeders,
Incomplete: numLeechers,
Peers: peersIPv4,
PeersIPv6: peersIPv6,
}
defer c.Response().SetConnectionClose()
return bencode.Marshal(c, resp)
}
96 changes: 0 additions & 96 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/fiber/v2/middleware/monitor"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/jackpal/bencode-go"
"golang.org/x/crypto/acme/autocert"
)

Expand Down Expand Up @@ -118,98 +117,3 @@ func docs(c *fiber.Ctx) error {
}
return c.Next()
}

type AnnounceRequest struct {
InfoHash string `query:"info_hash"`
PeerID string `query:"peer_id"`
IP string `query:"ip"`
Port uint16 `query:"port"`
Uploaded uint `query:"uploaded"`
Downloaded uint `query:"downloaded"`
Left uint `query:"left"`
Numwant uint `query:"numwant"`
Key string `query:"key"`
Compact bool `query:"compact"`
SupportCrypto bool `query:"supportcrypto"`
Event string `query:"event"`
}

func (req *AnnounceRequest) IsSeeding() bool {
return req.Left == 0
}

type AnnounceResponse struct {
Interval int `bencode:"interval"`
Complete int `bencode:"complete"`
Incomplete int `bencode:"incomplete"`
Peers []byte `bencode:"peers"`
PeersIPv6 []byte `bencode:"peers_ipv6"`
}

func announce(c *fiber.Ctx) error {
var req AnnounceRequest
err := c.QueryParser(&req)
if err != nil {
return err
}
req.IP = c.IP()
if req.Numwant == 0 {
req.Numwant = 30
}
switch req.Event {
case "stopped":
DeletePeer(c.Params("room"), req.InfoHash, req.IP, req.Port)
case "completed":
GraduateLeecher(c.Params("room"), req.InfoHash, req.IP, req.Port)
default:
PutPeer(c.Params("room"), req.InfoHash, req.IP, req.Port, req.IsSeeding())
}
peersIPv4, peersIPv6, numSeeders, numLeechers := GetPeers(c.Params("room"), req.InfoHash, req.IP, req.Port, req.IsSeeding(), req.Numwant)
interval := 120
if numSeeders == 0 {
interval /= 2
} else if numLeechers == 0 {
interval *= 2
}
resp := AnnounceResponse{
Interval: interval,
Complete: numSeeders,
Incomplete: numLeechers,
Peers: peersIPv4,
PeersIPv6: peersIPv6,
}
defer c.Response().SetConnectionClose()
return bencode.Marshal(c, resp)
}

type ScrapeRequest struct {
InfoHash string `query:"info_hash"`
}

type ScrapeResponse struct {
Files map[string]Stat `bencode:"files"`
}

type Stat struct {
Complete int `bencode:"complete"`
Incomplete int `bencode:"incomplete"`
// Downloaded uint `bencode:"downloaded"`
}

func scrape(c *fiber.Ctx) error {
var req ScrapeRequest
err := c.QueryParser(&req)
if err != nil {
return err
}
numSeeders, numLeechers := GetStats(c.Params("room"), req.InfoHash)
resp := ScrapeResponse{
Files: map[string]Stat{
req.InfoHash: {
Complete: numSeeders,
Incomplete: numLeechers,
},
},
}
return bencode.Marshal(c, resp)
}
38 changes: 38 additions & 0 deletions scrape.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package main

import (
"github.com/gofiber/fiber/v2"
"github.com/jackpal/bencode-go"
)

type ScrapeRequest struct {
InfoHash string `query:"info_hash"`
}

type ScrapeResponse struct {
Files map[string]Stat `bencode:"files"`
}

type Stat struct {
Complete int `bencode:"complete"`
Incomplete int `bencode:"incomplete"`
// Downloaded uint `bencode:"downloaded"`
}

func scrape(c *fiber.Ctx) error {
var req ScrapeRequest
err := c.QueryParser(&req)
if err != nil {
return err
}
numSeeders, numLeechers := GetStats(c.Params("room"), req.InfoHash)
resp := ScrapeResponse{
Files: map[string]Stat{
req.InfoHash: {
Complete: numSeeders,
Incomplete: numLeechers,
},
},
}
return bencode.Marshal(c, resp)
}

0 comments on commit 11533d6

Please sign in to comment.