Quellcode durchsuchen

receiving IMs + buddy list notifications works

Mike vor 3 Jahren
Ursprung
Commit
2d31cc0eed
4 geänderte Dateien mit 80 neuen und 13 gelöschten Zeilen
  1. 15 8
      cmd/main.go
  2. 54 0
      oscar/buddy.go
  3. 10 4
      oscar/icbm.go
  4. 1 1
      oscar/oservice.go

+ 15 - 8
cmd/main.go

@@ -8,6 +8,7 @@ import (
 	"net"
 	"net/http"
 	"os"
+	"strings"
 )
 
 func main() {
@@ -42,9 +43,10 @@ func main() {
 	}
 }
 
-func webServer(ch chan bool) {
+func webServer(ch chan string) {
 	http.HandleFunc("/send-im", func(w http.ResponseWriter, r *http.Request) {
-		ch <- true
+		body, _ := io.ReadAll(r.Body)
+		ch <- string(body)
 	})
 
 	if err := http.ListenAndServe(":3333", nil); err != nil {
@@ -59,7 +61,7 @@ func listenBOS() {
 		log.Fatal(err)
 	}
 
-	ch := make(chan bool, 1)
+	ch := make(chan string, 1)
 	go webServer(ch)
 
 	defer listener.Close()
@@ -79,11 +81,16 @@ func listenBOS() {
 	}
 }
 
-func sendIM(conn net.Conn, ch chan bool, seq *uint32) {
-	for range ch {
-		fmt.Println("sending im...")
-		if err := oscar.SendIM(conn, seq); err != nil {
-			panic(err.Error())
+func sendIM(conn net.Conn, ch chan string, seq *uint32) {
+	for msg := range ch {
+		fmt.Printf("sending im... %s\n", msg)
+		vals := strings.Split(msg, ":")
+
+		if err := oscar.SendIM(conn, seq, vals[0], vals[1]); err != nil {
+			//panic(err.Error())
+		}
+		if err := oscar.SetBuddyArrived(conn, seq, vals[0]); err != nil {
+			//panic(err.Error())
 		}
 	}
 }

+ 54 - 0
oscar/buddy.go

@@ -1,6 +1,7 @@
 package oscar
 
 import (
+	"encoding/binary"
 	"fmt"
 	"io"
 	"reflect"
@@ -101,3 +102,56 @@ func SendAndReceiveBuddyRights(flap *flapFrame, snac *snacFrame, r io.Reader, w
 
 	return writeOutSNAC(snac, flap, snacFrameOut, snacPayloadOut, sequence, w)
 }
+
+type snacBuddyArrived struct {
+	screenName   string
+	warningLevel uint16
+	TLVPayload
+}
+
+func (f *snacBuddyArrived) write(w io.Writer) error {
+	if err := binary.Write(w, binary.BigEndian, uint8(len(f.screenName))); err != nil {
+		return err
+	}
+	if err := binary.Write(w, binary.BigEndian, []byte(f.screenName)); err != nil {
+		return err
+	}
+	if err := binary.Write(w, binary.BigEndian, f.warningLevel); err != nil {
+		return err
+	}
+	if err := binary.Write(w, binary.BigEndian, uint16(len(f.TLVs))); err != nil {
+		return err
+	}
+	return f.TLVPayload.write(w)
+}
+
+func SetBuddyArrived(w io.Writer, sequence *uint32, screenName string) error {
+	flap := &flapFrame{
+		startMarker: 42,
+		frameType:   2,
+	}
+
+	snacFrameOut := snacFrame{
+		foodGroup: BUDDY,
+		subGroup:  BuddyArrived,
+		requestID: 12425,
+	}
+	snacPayloadOut := &snacBuddyArrived{
+		screenName:   screenName,
+		warningLevel: 0,
+		TLVPayload: TLVPayload{
+			TLVs: []*TLV{
+				{
+					tType: 0x01,
+					val:   uint16(0x0004),
+				},
+				{
+					tType: 0x06,
+					val:   uint16(0x0000),
+				},
+			},
+		},
+	}
+
+	return writeOutSNAC(nil, flap, snacFrameOut, snacPayloadOut, sequence, w)
+}

+ 10 - 4
oscar/icbm.go

@@ -42,7 +42,7 @@ func routeICBM(flap *flapFrame, snac *snacFrame, r io.Reader, w io.Writer, seque
 	case ICBMParameterQuery:
 		return SendAndReceiveICBMParameterReply(flap, snac, r, w, sequence)
 	case ICBMChannelMsgTohost:
-		panic("not implemented")
+		return SendAndReceiveChannelMsgTohost(flap, snac, r, w, sequence)
 	case ICBMChannelMsgToclient:
 		panic("not implemented")
 	case ICBMEvilRequest:
@@ -159,6 +159,12 @@ func SendAndReceiveICBMParameterReply(flap *flapFrame, snac *snacFrame, _ io.Rea
 	return writeOutSNAC(snac, flap, snacFrameOut, snacPayloadOut, sequence, w)
 }
 
+func SendAndReceiveChannelMsgTohost(flap *flapFrame, snac *snacFrame, _ io.Reader, w io.Writer, sequence *uint32) error {
+	fmt.Printf("SendAndReceiveChannelMsgTohost read SNAC frame: %+v\n", snac)
+
+	return nil
+}
+
 func ReceiveAddParameters(flap *flapFrame, snac *snacFrame, r io.Reader, w io.Writer, sequence *uint32) error {
 	fmt.Printf("ReceiveAddParameters read SNAC frame: %+v\n", snac)
 
@@ -259,7 +265,7 @@ func (m *messageData) write(w io.Writer) error {
 	return nil
 }
 
-func SendIM(w io.Writer, sequence *uint32) error {
+func SendIM(w io.Writer, sequence *uint32, screenName string, msg string) error {
 	flap := &flapFrame{
 		startMarker: 42,
 		frameType:   2,
@@ -273,13 +279,13 @@ func SendIM(w io.Writer, sequence *uint32) error {
 	snacPayloadOut := &snacClientIM{
 		cookie:     [8]byte{1, 2, 3, 4, 5, 6, 7, 8},
 		channelID:  1,
-		screenName: "testscreenname",
+		screenName: screenName,
 		TLVPayload: TLVPayload{
 			TLVs: []*TLV{
 				{
 					tType: 0x02,
 					val: &messageData{
-						text: "Test message",
+						text: msg,
 					},
 				},
 			},

+ 1 - 1
oscar/oservice.go

@@ -385,7 +385,7 @@ func ReceiveAndSendServiceRequestSelfInfo(flap *flapFrame, snac *snacFrame, _ io
 		subGroup:  OServiceUserInfoUpdate,
 	}
 	snacPayloadOut := &snacOServiceUserInfoUpdate{
-		screenName:   "screenname",
+		screenName:   "myscreenname",
 		warningLevel: 0,
 		TLVPayload: TLVPayload{
 			TLVs: []*TLV{