Advertisement
IRCgo

Strategy ChessBot in IRCgo #Chess

Mar 29th, 2023
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.61 KB | None | 0 0
  1. # compile using "nim c -d:release --threads:on ChessBot.nim"
  2. import std/net, std/strutils, std/osproc, std/streams, std/os, std/threadpool
  3.  
  4. const SERVER = "irc.ircgo.org"
  5. const POR = 6667
  6. const CHANNEL = "#chess"
  7. const NICK = "ChessBot"
  8. const ADMINS = ["Strategy", "He-Man"]
  9. const AUTHOR = "Strategy"
  10. const GNUCHESS_PATH = "/usr/local/bin/gnuchess"
  11.  
  12. var ch: Channel[string]
  13. open(ch)
  14.  
  15. proc readLineTimeout(readStream: Stream): int =
  16. while true:
  17. let k = readStream.readLine
  18. while not ch.trySend(k):
  19. sleep(10)
  20.  
  21. proc printLines(socket: Socket, channel: string, text: string) =
  22. for line in text.split("\n"):
  23. socket.send("PRIVMSG " & channel & " :" & line & "\n")
  24.  
  25. let gnuchess = startProcess(GNUCHESS_PATH, args = ["-m"])
  26. discard spawn readLineTimeout(gnuchess.outputStream)
  27.  
  28. sleep(1000)
  29. let s = ch.peek
  30. for _ in 1..<s:
  31. discard ch.recv
  32.  
  33. let socket = newSocket()
  34. socket.connect(SERVER, Port(POR))
  35.  
  36. socket.send("NICK " & NICK & "\n")
  37. socket.send("USER " & NICK & " * 0 :IRC Chess Bot\n")
  38.  
  39. while true:
  40. var data = socket.recvLine().split()
  41. echo("IRC: ", data)
  42. if data[0] == "PING":
  43. socket.send("PONG " & data[1] & "\n")
  44. elif data[0] == "":
  45. discard
  46. elif data[1] == "001":
  47. socket.send("JOIN " & CHANNEL & "\n")
  48. elif data[1] == "PRIVMSG" and data[3] == ":!chess":
  49. if data.len > 4:
  50. case data[4]
  51. of "hello": socket.send("PRIVMSG " & data[2] & " :HELLO " & data[0].split("!")[0][1 .. ^1] & "\n")
  52. of "author": socket.send("PRIVMSG " & data[2] & " :Author = " & AUTHOR & "\n")
  53. of "version": socket.send("PRIVMSG " & data[2] & " :Version = 0.1.0\n")
  54. of "gnuchess":
  55. gnuchess.inputstream.writeLine(data[5..^1].join(" "))
  56. gnuchess.inputstream.flush
  57. sleep(100)
  58. let s = ch.peek
  59. for _ in 1..<s:
  60. let k = ch.recv
  61. socket.send("PRIVMSG " & data[2] & " :" & k & "\n")
  62. discard ch.recv
  63. of "quit":
  64. if ADMINS.contains(data[0].split("!")[0][1 .. ^1]):
  65. socket.send("PRIVMSG " & data[2] & " :BYE\n")
  66. gnuchess.close
  67. socket.close
  68. break
  69. of "admins":
  70. socket.send("PRIVMSG " & data[2] & " :" & ADMINS.join(" ") & "\n")
  71. of "help":
  72. socket.printLines(data[2], """ChessBot
  73. !chess author prints author
  74. !chess version prints version
  75. !chess gnuchess <cmd> executes cmd in gnuchess and prints the output
  76. !chess admins prints bot admins
  77. !chess quit quits the ChessBot (only executable by bot admins)
  78. !chess help prints this message""")
  79. else:
  80. socket.send("PRIVMSG " & data[2] & " :Needs an argument\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement