2019-09-12 16:32:07 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"runtime"
|
|
|
|
"time"
|
|
|
|
"unsafe"
|
|
|
|
)
|
|
|
|
|
|
|
|
/*
|
|
|
|
#cgo LDFLAGS: -Wl,-rpath,'$ORIGIN' -L${SRCDIR}/../build -lnimbus -lm
|
|
|
|
#include "libnimbus.h"
|
|
|
|
|
2019-10-30 11:18:11 +00:00
|
|
|
void receiveHandler_cgo(received_message * msg, void* udata); // Forward declaration.
|
2019-09-12 16:32:07 +00:00
|
|
|
*/
|
|
|
|
import "C"
|
|
|
|
|
|
|
|
// Arrange that main.main runs on main thread.
|
|
|
|
func init() {
|
|
|
|
runtime.LockOSThread()
|
|
|
|
}
|
|
|
|
|
|
|
|
func poll() {
|
|
|
|
|
|
|
|
for {
|
|
|
|
fmt.Println("POLLING")
|
|
|
|
time.Sleep(1 * time.Microsecond)
|
|
|
|
C.nimbus_poll()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//export receiveHandler
|
2019-10-30 11:18:11 +00:00
|
|
|
func receiveHandler(msg *C.received_message, udata unsafe.Pointer) {
|
2019-09-12 16:32:07 +00:00
|
|
|
fmt.Printf("[nim-status] received message %s\n",
|
|
|
|
C.GoStringN((*C.char)(msg.decoded), (C.int)(msg.decodedLen)) )
|
|
|
|
fmt.Printf("[nim-status] source public key %x\n", msg.source)
|
2019-10-30 11:18:11 +00:00
|
|
|
msgCount := (*int)(udata)
|
|
|
|
*msgCount += 1
|
|
|
|
fmt.Printf("[nim-status] message count %d\n", *msgCount)
|
2019-09-12 16:32:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func Start() {
|
|
|
|
C.NimMain()
|
|
|
|
fmt.Println("[nim-status] Start Nimbus")
|
|
|
|
C.nimbus_start(30306)
|
|
|
|
}
|
|
|
|
|
|
|
|
func StatusListenAndPost(channel string) {
|
|
|
|
fmt.Println("[nim-status] Status Public ListenAndPost")
|
|
|
|
|
|
|
|
// TODO: free the CStrings?
|
|
|
|
// TODO: Is this doing a copy or not? If not, shouldn't we see issues when the
|
|
|
|
// nim GC kicks in?
|
|
|
|
symKeyId := C.GoString(C.nimbus_add_symkey_from_password(C.CString(channel)))
|
|
|
|
asymKeyId := C.GoString(C.nimbus_new_keypair())
|
|
|
|
|
2019-10-30 11:18:11 +00:00
|
|
|
msgCount := 0
|
2019-09-12 16:32:07 +00:00
|
|
|
options := C.filter_options{symKeyID: C.CString(symKeyId),
|
|
|
|
minPow: 0.002,
|
|
|
|
topic: C.nimbus_string_to_topic(C.CString(channel)).topic}
|
2019-10-30 11:18:11 +00:00
|
|
|
filterId := C.GoString(C.nimbus_subscribe_filter(&options,
|
|
|
|
(C.received_msg_handler)(unsafe.Pointer(C.receiveHandler_cgo)),
|
|
|
|
unsafe.Pointer(&msgCount)))
|
|
|
|
fmt.Printf("[nim-status] filter subscribed, id: %s\n", filterId)
|
2019-09-12 16:32:07 +00:00
|
|
|
|
|
|
|
postMessage := C.post_message{symKeyID: C.CString(symKeyId),
|
2019-10-25 15:31:42 +00:00
|
|
|
sourceID: C.CString(asymKeyId),
|
2019-09-12 16:32:07 +00:00
|
|
|
ttl: 20,
|
|
|
|
topic: C.nimbus_string_to_topic(C.CString(channel)).topic,
|
|
|
|
powTarget: 0.002,
|
|
|
|
powTime: 1.0}
|
|
|
|
|
|
|
|
i := 0
|
|
|
|
for {
|
|
|
|
C.nimbus_poll()
|
|
|
|
t := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
|
i = i + 1
|
|
|
|
time.Sleep(1 * time.Microsecond)
|
|
|
|
message := fmt.Sprintf("[\"~#c4\",[\"Message:%d\",\"text/plain\",\"~:public-group-user-message\",%d,%d,[\"^ \",\"~:chat-id\",\"%s\",\"~:text\",\"Message:%d\"]]]", i, t*100, t, channel, i)
|
|
|
|
if i%1000 == 0 {
|
|
|
|
fmt.Println("[nim-status] posting", message)
|
|
|
|
postMessage.payload = (C.CString(message))
|
2019-10-25 12:50:14 +00:00
|
|
|
C.nimbus_post(&postMessage)
|
2019-09-12 16:32:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
nprocs := runtime.GOMAXPROCS(0)
|
|
|
|
fmt.Println("GOMAXPROCS ", nprocs)
|
|
|
|
|
|
|
|
Start()
|
|
|
|
StatusListenAndPost("status-test-go")
|
|
|
|
}
|