Advertisement
Guest User

in progress f# bot

a guest
Oct 8th, 2014
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.99 KB | None | 0 0
  1. open System
  2. open System.IO
  3. open System.Net
  4. open System.Net.Sockets
  5. open System.Text.RegularExpressions
  6. open System.Net.Security
  7. open System.Security.Cryptography.X509Certificates
  8.  
  9. let server = "chat.freenode.net"
  10. let port  = 6697
  11. let channel = "batoto"
  12. let nick = "mantabot2"
  13.  
  14. // establish and confirm a connection to the server
  15. let irc_client = new TcpClient()
  16. irc_client.Connect(server, port)
  17.  
  18. if (irc_client.Connected = false) then Console.WriteLine("Did not connect.")
  19. else Console.WriteLine("Connected to " + server)
  20.  
  21. // get the input and output streams in ssl
  22. //cheating verification
  23.  
  24. let validatecheat = RemoteCertificateValidationCallback(fun _ _ _ _ -> true)
  25. let selectioncheat = fun _ -> System.Security.Cryptography.X509Certificates.X509Certificate()
  26. let certificatecheat = LocalCertificateSelectionCallback( fun _ _ _ _ -> selectioncheat)
  27.  
  28. (*let irc_reader =
  29.     let stream = irc_client.GetStream()
  30.     let ssl = new SslStream(stream, true, validatecheat, certificatecheat)
  31.     ssl*)
  32.    
  33. let irc_writer =
  34.     let stream = irc_client.GetStream()
  35.     let ssl = new SslStream(stream, true, validatecheat, certificatecheat)
  36.     ssl.AuthenticateAsClient(server)
  37.     ssl
  38.  
  39. //authenticate
  40.  
  41. //irc_reader.Flush()
  42. //irc_reader.AuthenticateAsClient(server)
  43.  
  44.  
  45. //non ssl version, for testing
  46. (*
  47. let irc_reader =
  48.     let stream = irc_client.GetStream()
  49.     let read = new StreamReader( stream )
  50.     read
  51.    
  52. let irc_writer =
  53.     let stream = irc_client.GetStream()
  54.     let write = new StreamWriter( stream )
  55.     write
  56.     *)
  57.  
  58. // identify with the server and join a room
  59.  
  60. let stream = new StreamReader(irc_writer, true)
  61.  
  62. let writer = new StreamWriter(irc_writer)
  63.  
  64. let send (data: string) =
  65.     writer.WriteLine(data + "\n\r")
  66.     writer.Flush()
  67.     Console.WriteLine("\n<{ " + data)
  68.  
  69.  
  70. Console.Write("\n}> "); Console.Write(stream.Read())
  71. send ("PASS " + "i_am_" + nick)
  72. Console.Write("\n}> "); Console.Write(stream.Read())
  73. send ("USER " + nick + " " + nick + " " + nick + " :mantatanta")
  74. Console.Write("\n}> "); Console.Write(stream.Read())
  75. send ("NICK " + nick)
  76. Console.Write("\n}> "); Console.Write(stream.Read())
  77. send ("JOIN " + channel)
  78. Console.Write("\n}> "); Console.Write(stream.Read())
  79. //send ("SAY :Hello")
  80. Console.Write("\n}> "); Console.Write(stream.Read())
  81.  
  82. // some flow control stuff
  83.  
  84. let irc_privmsg ( writer : StreamWriter ) ( phrase : string ) =
  85.     writer.WriteLine( "PRIVMSG " + channel + phrase )
  86.  
  87. let irc_get_msg ( line : string )=
  88.     line.Substring( line.Substring(1).IndexOf(":") + 2)
  89.  
  90. // main loop operation; homeostasis
  91. while stream.EndOfStream = false do
  92.     let line = stream.ReadLine()
  93.     Console.Write("\n}> " + line)
  94.  
  95.    
  96.     if line.Contains("No ident response") then
  97.         send ("PONG " + server)
  98.         send ("USER " + nick + " " + nick + " " + nick + " :mantatanta")  
  99.         send ("NICK " + nick)
  100.  
  101.     if (line.Contains("PING")) then
  102.         send ("PONG " + server)
  103.  
  104.     if (line.Contains("PRIVMSG")) then
  105.         if (line.Contains("version") || line.Contains("VERSION")) then
  106.             send ("PRIVMSG " + channel + " " + nick + " on " + Environment.Version.ToString())
  107.         if (line.Contains("date") || line.Contains("DATE")) then
  108.             send (System.DateTime.Now.ToString())
  109.         else Console.Write(line)
  110.         send ("PONG" + server)
  111.         (*
  112.        
  113.   // active pattern for matching commands
  114.     let (|Prefix|_|) (p:string) (s:string) =
  115.         if s.StartsWith( p ) then
  116.           Some( s.Substring(p.Length))
  117.         else
  118.           None
  119.     let (msg:string) = irc_get_msg line
  120.  
  121.   // really maintainable list of patterns to match against
  122.     match msg with
  123.     | Prefix "No ident response" rest ->
  124.         send ("PONG " + rest)
  125.         send ("USER " + nick + " " + nick + " " + nick + " :mantatanta")  
  126.         send ("NICK " + nick)
  127.     | Prefix "PING" rest ->
  128.         send ("PONG" + rest)
  129.     | Prefix "PRIVMSG" rest ->
  130.         match rest with
  131.         | "version" next ->
  132.         *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement