]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/transaction_handlers.go
Add support for server banner
[rbdr/mobius] / hotline / transaction_handlers.go
index 57639674c445695cfd6c4b9f0ab83a73c78c9c99..9f07fe1860d014a3d21a8b48ac0f96e6a1d5422d 100644 (file)
@@ -231,6 +231,10 @@ var TransactionHandlers = map[uint16]TransactionType{
                Name:    "tranUserBroadcast",
                Handler: HandleUserBroadcast,
        },
+       tranDownloadBanner: {
+               Name:    "tranDownloadBanner",
+               Handler: HandleDownloadBanner,
+       },
 }
 
 func HandleChatSend(cc *ClientConn, t *Transaction) (res []Transaction, err error) {
@@ -964,7 +968,7 @@ func HandleTranAgreed(cc *ClientConn, t *Transaction) (res []Transaction, err er
                cc.AutoReply = []byte{}
        }
 
-       cc.notifyOthers(
+       for _, t := range cc.notifyOthers(
                *NewTransaction(
                        tranNotifyChangeUser, nil,
                        NewField(fieldUserName, cc.UserName),
@@ -972,7 +976,13 @@ func HandleTranAgreed(cc *ClientConn, t *Transaction) (res []Transaction, err er
                        NewField(fieldUserIconID, *cc.Icon),
                        NewField(fieldUserFlags, *cc.Flags),
                ),
-       )
+       ) {
+               cc.Server.outbox <- t
+       }
+
+       if cc.Server.Config.BannerFile != "" {
+               cc.Server.outbox <- *NewTransaction(tranServerBanner, cc.ID, NewField(fieldBannerType, []byte("JPEG")))
+       }
 
        res = append(res, cc.NewReply(t))
 
@@ -1925,3 +1935,33 @@ func HandleMakeAlias(cc *ClientConn, t *Transaction) (res []Transaction, err err
        res = append(res, cc.NewReply(t))
        return res, err
 }
+
+func HandleDownloadBanner(cc *ClientConn, t *Transaction) (res []Transaction, err error) {
+       transactionRef := cc.Server.NewTransactionRef()
+       data := binary.BigEndian.Uint32(transactionRef)
+
+       ft := &FileTransfer{
+               ReferenceNumber: transactionRef,
+               Type:            bannerDownload,
+       }
+
+       fi, err := cc.Server.FS.Stat(filepath.Join(cc.Server.ConfigDir, cc.Server.Config.BannerFile))
+       if err != nil {
+               return res, err
+       }
+
+       size := make([]byte, 4)
+       binary.BigEndian.PutUint32(size, uint32(fi.Size()))
+
+       cc.Server.mux.Lock()
+       defer cc.Server.mux.Unlock()
+       cc.Server.FileTransfers[data] = ft
+
+       res = append(res, cc.NewReply(t,
+               NewField(fieldRefNum, transactionRef),
+               NewField(fieldTransferSize, size),
+       ))
+
+       res = append(res, cc.NewReply(t))
+       return res, err
+}