Merge pull request #62 from pidario/feat/dcc-support
start of DCC implementation
This commit is contained in:
commit
63afd839be
13 changed files with 358 additions and 1 deletions
|
@ -70,6 +70,9 @@ func connectIRC(server *storage.Server, state *State, srcIP []byte) *irc.Client
|
|||
}
|
||||
}
|
||||
|
||||
i.DownloadFolder = storage.Path.Downloads(state.user.Username)
|
||||
i.Autoget = cfg.Autoget
|
||||
|
||||
state.setIRC(server.Host, i)
|
||||
i.Connect(address)
|
||||
go newIRCHandler(i, state).run()
|
||||
|
|
|
@ -63,6 +63,19 @@ func (i *ircHandler) run() {
|
|||
} else if state.Connected {
|
||||
i.log("Connected")
|
||||
}
|
||||
|
||||
case progress := <-i.client.Progress:
|
||||
if progress.Error != nil {
|
||||
i.sendDCCInfo("%s: Download failed (%s)", true, progress.File, progress.Error)
|
||||
} else if progress.PercCompletion == 100 {
|
||||
i.sendDCCInfo("Download finished, get it here: %s://%s/downloads/%s/%s", true,
|
||||
i.state.String("scheme"), i.state.String("host"), i.state.user.Username, progress.File)
|
||||
} else if progress.PercCompletion == 0 {
|
||||
i.sendDCCInfo("%s: Starting download", true, progress.File)
|
||||
} else {
|
||||
i.sendDCCInfo("%s: %.1f%%, %s, %s remaining, %.1fs left", false, progress.File,
|
||||
progress.PercCompletion, progress.Speed, progress.BytesRemaining, progress.SecondsToGo)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -418,6 +431,20 @@ func (i *ircHandler) log(v ...interface{}) {
|
|||
log.Println("[IRC]", i.state.user.ID, i.client.Host, s[:len(s)-1])
|
||||
}
|
||||
|
||||
func (i *ircHandler) sendDCCInfo(message string, log bool, a ...interface{}) {
|
||||
msg := Message{
|
||||
Server: i.client.Host,
|
||||
From: "@dcc",
|
||||
Content: fmt.Sprintf(message, a...),
|
||||
}
|
||||
i.state.sendJSON("pm", msg)
|
||||
|
||||
if log {
|
||||
i.state.user.AddOpenDM(msg.Server, msg.From)
|
||||
i.state.user.LogMessage(betterguid.New(), msg.Server, msg.From, msg.From, msg.Content)
|
||||
}
|
||||
}
|
||||
|
||||
func parseMode(mode string) *Mode {
|
||||
m := Mode{}
|
||||
add := false
|
||||
|
|
|
@ -3,6 +3,7 @@ package server
|
|||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
|
@ -180,6 +181,33 @@ func (d *Dispatch) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
d.upgradeWS(w, r, state)
|
||||
} else if strings.HasPrefix(r.URL.Path, "/downloads") {
|
||||
state := d.handleAuth(w, r, false, false)
|
||||
if state == nil {
|
||||
log.Println("[Auth] No state")
|
||||
fail(w, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
params := strings.Split(strings.Trim(r.URL.Path, "/"), "/")
|
||||
|
||||
if len(params) == 3 {
|
||||
userID, err := strconv.ParseUint(params[1], 10, 64)
|
||||
if err != nil {
|
||||
fail(w, http.StatusBadRequest)
|
||||
}
|
||||
|
||||
if userID != state.user.ID {
|
||||
fail(w, http.StatusUnauthorized)
|
||||
}
|
||||
|
||||
filename := params[2]
|
||||
|
||||
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
|
||||
http.ServeFile(w, r, storage.Path.DownloadedFile(state.user.Username, filename))
|
||||
} else {
|
||||
fail(w, http.StatusNotFound)
|
||||
}
|
||||
} else {
|
||||
d.serveFiles(w, r)
|
||||
}
|
||||
|
|
|
@ -63,6 +63,12 @@ func (h *wsHandler) dispatchRequest(req WSRequest) {
|
|||
func (h *wsHandler) init(r *http.Request) {
|
||||
h.state.setWS(h.addr.String(), h.ws)
|
||||
h.state.user.SetLastIP(addrToIPBytes(h.addr))
|
||||
if r.TLS != nil {
|
||||
h.state.Set("scheme", "https")
|
||||
} else {
|
||||
h.state.Set("scheme", "http")
|
||||
}
|
||||
h.state.Set("host", r.Host)
|
||||
|
||||
log.Println(h.addr, "[State] User ID:", h.state.user.ID, "|",
|
||||
h.state.numIRC(), "IRC connections |",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue