Advertisement
Guest User

my code

a guest
Oct 24th, 2014
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "gopkg.in/qml.v0"
  7. "log"
  8. "os"
  9. //"bufio"
  10. "net"
  11.  
  12. "strings"
  13. )
  14.  
  15. type Control struct {
  16. Root qml.Object
  17. Convstring string
  18. userlist string
  19. InputString string
  20. User string
  21. }
  22.  
  23. type Message struct {
  24. Kind string //type of message ("CONNECT","PRIVATE","PUBLIC","DISCONNECT","HEARTBEAT","LIST","ADD")
  25. Username string //my username
  26. IP string //ip address of my computer
  27. MSG string //message
  28. UserNames [100]string
  29. IPs [100]string
  30. Count int
  31. }
  32.  
  33. var (
  34. incoming chan string = make(chan string)
  35. err error
  36. tcpAddr *net.TCPAddr
  37. //enc *json.Encoder
  38. conList [111]net.Conn
  39. userList [111]string
  40. count int
  41. listOfUsers string
  42. msg Message
  43. firstConnect string
  44. )
  45.  
  46. /*
  47. func Send(ctrl Control) {
  48.  
  49. //reader := bufio.NewReader(os.Stdin)
  50. //ctrl:=new(Control)
  51.  
  52. for {
  53. //ctrl.InputString,_=reader.ReadString('\n')
  54. //fmt.Println(*ctrl)
  55. if ctrl.InputString=="" {
  56. conn.Close()
  57. fmt.Println("closed connection")
  58. os.Exit(0)
  59. }
  60.  
  61.  
  62. err := enc.Encode(ctrl)
  63. handleErr(err)
  64. }
  65. */
  66.  
  67. func (ctrl *Control) TextEntered(text qml.Object) {
  68. //this method is called whenever a return key is typed in the text entry field. The qml object calls this function
  69. ctrl.InputString = text.String("text") //the ctrl's inputString field holds the message
  70. //you will want to send it to the server
  71. //but for now just send it back to the conv field
  72. //Send(*ctrl)
  73. sendMessage()
  74. ctrl.updateText(ctrl.InputString)
  75. }
  76.  
  77. func (ctrl *Control) updateText(toAdd string) {
  78. //call this method whenever you want to add text to the qml object's conv field
  79. ctrl.Convstring = ctrl.Convstring + toAdd + "\n" //also keep track of everything in that field
  80. ctrl.Root.ObjectByName("conv").Set("text", ctrl.Convstring)
  81. qml.Changed(ctrl, &ctrl.Convstring)
  82. }
  83.  
  84. func (ctrl *Control) addList(name string) {
  85. //call this method whenever you want to change the text in the qml object's userlist field
  86. ctrl.userlist = ctrl.userlist + name
  87. ctrl.Root.ObjectByName("userlist").Set("text", name)
  88. qml.Changed(ctrl, &ctrl.userlist)
  89. }
  90.  
  91. func (ctrl *Control) handleServer(dec *json.Decoder) {
  92. for {
  93.  
  94. var msg Message
  95. dec.Decode(&msg)
  96.  
  97. //fmt.Println(newText)
  98.  
  99. ctrl.updateText(msg.MSG)
  100.  
  101. }
  102. }
  103.  
  104. func handleClients() {
  105. service := ":1500"
  106. tcpAddr, err := net.ResolveTCPAddr("tcp", service)
  107. handleErr(err)
  108. listener, err := net.ListenTCP("tcp", tcpAddr)
  109. handleErr(err)
  110. msg.Count = 0
  111.  
  112. for {
  113.  
  114. conn, err := listener.Accept()
  115.  
  116. conList[msg.Count] = conn
  117. idNum := msg.Count
  118. msg.Count++
  119. //fmt.Println(count)
  120. if err != nil {
  121. continue
  122. }
  123. go handleClient(conn, idNum)
  124. }
  125. }
  126.  
  127. func handleClient(conn net.Conn, userNum int) {
  128. defer conn.Close()
  129. dec := json.NewDecoder(conn)
  130. enc := json.NewEncoder(conn)
  131. //enc := json.NewEncoder(conn)
  132. var ctrl Control
  133. var userName string
  134. dec.Decode(&msg)
  135.  
  136. msg.UserNames[userNum] = userName
  137.  
  138. for {
  139. var newMsg Message
  140. //err:=dec.Decode(&ctrl)
  141. dec.Decode(&newMsg)
  142. msg.UserNames[userNum] = newMsg.Username
  143. /*
  144. if err != nil {
  145. fmt.Println("closing connection")
  146. return
  147. }
  148. */
  149. if newMsg.Kind == "CONNECT" {
  150. for i := 0; i < userNum; i++ {
  151. if newMsg.Username == newMsg.UserNames[i] {
  152. enc := json.NewEncoder(conn)
  153. //fmt.Println(ctrl.InputString)
  154. msg.MSG = "you have been disconnected because of your username"
  155. msg.MSG = "Admin: " + msg.MSG
  156. enc.Encode(msg)
  157. return
  158. }
  159. }
  160.  
  161. msg.IPs[userNum] = newMsg.IP
  162. var listOfUsers string
  163. for i := 0; i < count; i++ {
  164.  
  165. listOfUsers = listOfUsers + msg.UserNames[i] + "\n"
  166. }
  167. ctrl.addList(listOfUsers)
  168. enc.Encode(msg)
  169.  
  170. }
  171. if newMsg.Kind == "ADD"{
  172.  
  173. }
  174. if newMsg.Kind == "PUBLIC" {
  175. ctrl.updateText(newMsg.MSG)
  176. }
  177. if ctrl.Convstring == "ivtuitvtv" {
  178. var tempList [111]string
  179. listOfUsers = ""
  180. for i := 0; i < msg.Count; i++ {
  181. if ctrl.User == userList[i] {
  182.  
  183. } else {
  184. tempList[i] = userList[i]
  185.  
  186. }
  187. }
  188. userList = tempList
  189. return
  190.  
  191. }
  192. }
  193. }
  194.  
  195. func sendMessage() {
  196. if strings.HasPrefix(msg.MSG, "CONNECT") {
  197. msg.Kind = "CONNECT"
  198. tcpAddr, err = net.ResolveTCPAddr("tcp", firstConnect)
  199. handleErr(err)
  200. conn, err := net.DialTCP("tcp", nil, tcpAddr)
  201. handleErr(err)
  202. conList[count] = conn
  203. count++
  204.  
  205. } else if strings.HasPrefix(msg.MSG, "PUBLIC") {
  206. msg.Kind = "PUBLIC"
  207. }
  208.  
  209. for i := 0; i < msg.Count; i++ {
  210. enc := json.NewEncoder(conList[i])
  211. dec := json.NewDecoder(conList[i])
  212. //fmt.Println(ctrl.InputString)
  213.  
  214. msg.MSG = msg.Username + ": " + msg.MSG
  215.  
  216. enc.Encode(msg)
  217. if msg.Kind == "CONNECT" {
  218. var newMsg Message
  219. dec.Decode(&newMsg)
  220. msg.IPs = newMsg.IPs
  221. msg.UserNames = newMsg.UserNames
  222. msg.Count = newMsg.Count
  223. for i := 0; i < msg.Count; i++ {
  224. tcpAddr, err = net.ResolveTCPAddr("tcp", msg.IPs[msg.Count])
  225. handleErr(err)
  226. conn, err := net.DialTCP("tcp", nil, tcpAddr)
  227. handleErr(err)
  228. conList[count] = conn
  229. count++
  230. enc = json.NewEncoder(conList[i])
  231. dec = json.NewDecoder(conList[i])
  232. msg.Kind = "ADD"
  233. enc.Encode(msg)
  234. }
  235. }
  236. }
  237. }
  238.  
  239. func main() {
  240. msg.Username = "Nick"
  241. msg.IP = "172.17.9.78:1500"
  242. msg.IPs[0] = msg.IP
  243. msg.UserNames[0] = msg.Username
  244. firstConnect = ""
  245. go handleClients()
  246.  
  247. engine := qml.NewEngine()
  248.  
  249. ctrl := Control{Convstring: ""}
  250. ctrl.Convstring = ""
  251. context := engine.Context()
  252. context.SetVar("ctrl", &ctrl)
  253.  
  254. component, err := engine.LoadFile("chat_ui2.qml")
  255. if err != nil {
  256. fmt.Println("no file to load for ui")
  257. fmt.Println(err.Error())
  258. os.Exit(0)
  259. }
  260. win := component.CreateWindow(nil)
  261.  
  262. ctrl.Root = win.Root()
  263.  
  264. win.Show()
  265. //ctrl.updateText("adding line of text to the conv field")
  266. //ctrl.addList("adding to list")
  267. //ctrl1 := Control
  268.  
  269. win.Wait() //blocks until the window is closed
  270.  
  271. /*
  272. ctrl.Convstring="ivtuitvtv"
  273. enc = json.NewEncoder(conn)
  274. err = enc.Encode(ctrl)
  275. handleErr(err)
  276. */
  277.  
  278. }
  279.  
  280. func handleErr(err error) {
  281. if err != nil {
  282. log.Fatal(err)
  283. }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement