Advertisement
Shiny_

bot

May 10th, 2014
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 9.68 KB | None | 0 0
  1. require "cgi"                               # Moduł cgi wymagany przez bota
  2. require "cinch"                             # Moduł cinch wymagany przez bota
  3. require "nokogiri"                          # Moduł nokogiri wymagany przez bota
  4. require "open-uri"                          # Moduł open-uri wymagany przez bota
  5. require "rubygems"
  6. require "json"
  7. require "wolfram"                           # Moduł wolfram wymagany przez bota
  8.  
  9. jsonfile         = open("bot.json")
  10. test             = jsonfile.read
  11. parsed_file      = JSON.parse(test)
  12.  
  13. Wolfram.appid    = parsed_file["Wolfram"]["ID"]
  14. #"ID Twojej aplikacji"  # Wymagana rejestracja http://products.wolframalpha.com/api/ aby je uzyskać
  15. ADMIN_OF_BOT     = parsed_file["Bot"]["Admin"]
  16. #"Twój pseudonim"      # Podaj swój pseudonim, aby móc BOT_NAMEistrować  botem
  17. BOT_NAME         = parsed_file["Bot"]["Name"]
  18. #"Pseudonim bota"       # Pseudonim bota
  19. PASSWORD         = parsed_file["Config"]["Password"]
  20. #"Hasło"           # Hasło bota
  21. PORT             = parsed_file["Config"]["Port"]
  22. #6667           # Port do serwera IRC
  23.  
  24. TESTING          = parsed_file["Config"]["Testing"]
  25. #true           # "true" oznacza wejście bota na testowy kanał, false - wejście bota na prawdziwy kanał
  26. AUTOREJOIN       = parsed_file["Config"]["Autorejoin"]
  27. #true               # "true" oznacza, że po wyrzuceniu bota, będzie on po krótkiej chwili ponownie dołączać do czatu
  28. SERVER_NAME      = parsed_file["Config"]["Host"]
  29. #"Host serwera"     # Definiuje host serwera. Wpisujesz go w formacie irc.tld lub irc.irc.tld
  30.  
  31. BOT_NICK         = BOT_NAME         # Definiuje BOT_NICK jako "Pseudonim bota"
  32. BOT_REALNAME     = BOT_NAME         # Definiuje BOT_REALNAME jako "Pseudonim bota"
  33. BOT_USER         = BOT_REALNAME         # Definiuje BOT_USER jako "Pseudonim bota"
  34.  
  35. REGEX__GOOGLE    = /^!g (.+)/i          # Za pomocą wpisania !g tekst sprawdza i wyświetla pierwszy wynik z wyszukiwarki Google
  36. REGEX__LENNY     = /\blenny(face)?\b/i      # Zwykłe wyrażenie regularne, sprawdzające, czy zostało wpisane lenny bądź lennyface na IRC
  37. REGEX__SAY       = /\Asay (?<msg>.*)\z/i    # Pisze jako bot po wpisaniu /msg nick_bota say wiadomość
  38. REGEX__WOLFRAM   = /\A% (?<query>.*)\z/i    # Sprawdza za pomocą wolframa różne wyniki/wiadomości
  39.  
  40. if TESTING == true                  # Sprawdza, czy zdefiniowane wcześniej TESTING jest prawdziwe
  41.     CHANNEL_NAME  = parsed_file["Config"]["TestChanName"]
  42.     #"nazwa testowego kanału"      # Jeśli tak, wchodzi na kanał testowy
  43. elsif TESTING == false                  # Jeśli zdefiniowane wcześniej TESTING jest nieprawdziwe
  44.     CHANNEL_NAME  = parsed_file["Config"]["RealChanName"]
  45.     #"nazwa kanału"            # Wchodzi na zwykły kanał
  46. end                         # Koniec sprawdzenia
  47.  
  48. # Definiuje zmienną "bot" jako nowego bota frameworka Cinch
  49. bot = Cinch::Bot.new do
  50.     # Moduł "helpers" zawiera metody, które pozwalają na uproszczenie pisania pluginów bota, przez ukrywanie części API
  51.     helpers do
  52.    
  53.         # Definiuje nową funkcję o nazwie Google, która ma za zadanie sprawdzać wyniki z wyszukiwarki Google
  54.         def google(query)
  55.        
  56.             # Tworzy nową zmienną o nazwie "url" i przypisuje jej adres URL
  57.             url = "http://www.google.pl/search?q=#{CGI.escape(query)}"
  58.            
  59.             # Tworzy nową zmienną o nazwie "res", przypisując jej możliwość otwarcia wcześniej zdefiniowanej zmiennej "url" za pomocą modułu Nokogiri, która wyszuka w kodzie przeglądarki nagłówek 3 poziomu z klasą o nazwie r (czyli <h3 class = "r">)
  60.             res = Nokogiri::HTML(open(url)).at("h3.r")
  61.            
  62.             # Tworzy nową zmienną o nazwie "title", przypisując do poprzednio stworzonej zmiennej "res" możliwość pobrania tekstu za pomocą ".text"
  63.             title = res.text
  64.            
  65.             # Tworzy nową zmienną o nazwie "link", przypisując do niej zmienną "res", która wyszuka w kodzie HTML wszystkie linki spod tagu <a href>
  66.             link = res.at('a')[:href]
  67.            
  68.             # Tworzy nową zmienną o nazwie "desc", przypisując ją do zmiennej "res" i umożliwiając "podążanie" za tagiem <div> oraz jego dziećmi, które w pierwszej kolejności (.first) muszą być typem tekstowym (.text)
  69.             desc = res.at("./following::div").children.first.text
  70.  
  71.             # W przypadku nieznalezienia żadnych wyników, pokazuje stosowny komunikat
  72.             rescue "Nie znaleziono żadnych wyników."
  73.            
  74.             # W przypadku znalezienia wyników musi, za pomocą modułu cgi, odpowiednio spreparować treści HTML i usunąć wszelkie tagi (unescape_html), następnie pogrupować je według tytułu (title), opisu (desc) oraz podania linku (link) oraz przymusowo dekodować całą treść z ISO-8859-2 do UTF-8
  75.             else
  76.                 # W przypadku znalezienia "krzaczków", każdy z nich jest zamieniany na polski odpowiednik za pomocą funkcji "gsub"
  77.                 CGI.unescape_html(CGI.unescape("#{title} - #{desc} (#{link})")).force_encoding("ISO-8859-2").encode("UTF-8")
  78.                 .gsub("Âą", "ą")
  79.                 .gsub("ĂŚ", "ć")
  80.                 .gsub("ĂŞ", "ę")
  81.                 .gsub("Âł", "ł")
  82.                 .gsub("Ăą", "ń")
  83.                 .gsub("Ăł", "ó")
  84.                 .gsub("Âś", "ś")
  85.                 .gsub("Âź", "ź")
  86.                 .gsub("Âż", "ż")
  87.                 .gsub("–", "-")
  88.                 .gsub(/\Podobne+/, "")
  89.                 .gsub("‎Kopia", "")
  90.                 .gsub("‎KopiaPodobne ", "")
  91.                 .gsub("►", "")
  92.                 .gsub(/\(\/url\?q=/, "Link: ")
  93.                 .gsub(/\(\/images\?q=/, "Obrazek: ")
  94.                 .gsub(/\/&sa=.+/, "")
  95.         # Kończy definicję funkcji google
  96.         end
  97.     # Zakończenie dla modułu "helpers"
  98.     end
  99.    
  100.     # Podstawowa konfiguracja bota IRC, tworząca nową zmienną "c"
  101.     configure do |c|
  102.         c.server            = SERVER_NAME       # Konfiguruje zmienną c.server i przypisuje ją do zmiennej SERVER_NAME, zawierającej nazwę hosta serwera IRC
  103.         c.port              = PORT              # Konfiguruje zmienną c.port i przypisuje ją do zmiennej PORT, zawierającej port serwera IRC
  104.         c.channels          = [CHANNEL_NAME]    # Konfiguruje zmienną c.channels i przypisuje ją do zmiennej CHANNEL_NAME, zawierającej nazwę kanału IRC, na który ma wejść bot
  105.         c.nick              = BOT_NICK          # Konfiguruje zmienną c.nick i przypisuje ją do zmiennej BOT_NICK, zawierającej nazwę bota
  106.         c.user              = BOT_USER          # Konfiguruje zmienną c.user i przypisuje ją do zmiennej BOT_USER, zawierającej nazwę bota
  107.         c.realname          = BOT_REALNAME      # Konfiguruje zmienną c.realname i przypisuje ją do zmiennej BOT_REALNAME, zawierającej prawdziwą nazwę bota
  108.         c.password          = PASSWORD          # Konfiguruje zmienną c.password i przypisuje ją do zmiennej PASSWORD, zawierającej hasło dla bota
  109.     # Kończy konfigurację bota
  110.     end
  111.  
  112.     # Określa to co się dzieje, gdy bot wejdzie na kanał
  113.     on :join do
  114.         # Wysyła do serwera IRC informację "MODE BOT_NICK +B", która zawiera wiadomość o tym, że dany użytkownik jest botem
  115.         bot.irc.send "MODE " + BOT_NICK + " +B"
  116.     # Zakańcza daną funkcję
  117.     end
  118.    
  119. if AUTOREJOIN == true                       # Jeżeli definicja AUTOREJOIN jest ustawiona na "true", funkcja poniżej wywoła się pomyślnie
  120.     # Określa to co ma się dziać, gdy bot zostanie wyrzucony
  121.     on :kick do
  122.         # Wysyła - za pomocą zmiennej globalnej bot - do kanału o zdefiniowanej wcześniej nazwie "CHANNEL_NAME" informację, że bot ma wejść
  123.         bot.Channel(CHANNEL_NAME).join
  124.     # Zakańcza daną funkcję
  125.     end
  126. end                                         # Kończy sprawdzanie, czy definicja AUTOREJOIN jest ustawiona na "true"
  127.  
  128.     # Określa to co ma się dziać po wysłaniu określonej wiadomości (:message) (w tym wypadku tą wiadomością jest wyrażenie regularne, zdefiniowane jako REGEX__GOOGLE) i tworzy nowe zmienne, "m" oraz "params". Zmienna "params" pozwala na przechwycenie zawartości tego, co zostało wpisane
  129.     on :message, REGEX__GOOGLE do |m, params|
  130.         # Wysyła wiadomość do wszystkich użytkowników na czacie (m.reply), sprawdzając wcześniej za pomocą funkcji "google(query)" zapytanie do wyszukiwarki Google
  131.         m.reply google(params)
  132.     # Zakańcza funkcję wysyłającą wiadomość
  133.     end
  134.    
  135.     # Określa to co ma się dziać po wysłaniu określonej wiadomości (:message) (w tym wypadku tą wiadomością jest wyrażenie regularne, zdefiniowane jako REGEX__SAY) i tworzy nową zmienną |m|
  136.     on :message, REGEX__SAY do |m|
  137.         # Gdy użytkownik (m.user.to_s.downcase)
  138.             # gdzie:
  139.                 # m to zmienna
  140.                 # user to użytkownik IRC, w tym wypadku bot
  141.                 # to_s to konwersja do ciągu znaków
  142.                 # downcase to konwersja całej zawartości na małe litery
  143.         # jest BOT_NAMEistratorem (do sprawdzenia służy definicja BOT_NAME)      
  144.         if m.user.to_s.downcase == ADMIN_OF_BOT.downcase
  145.             # Tworzy nową zmienną zawierającą w sobie wyrażenie regularne REGEX__SAY, sprawdzające w zmiennej m (m.message) całą wiadomość [:msg]
  146.             msg = REGEX__SAY.match(m.message)[:msg]
  147.             # Wysyła - za pomocą zmiennej globalnej bot - do kanału o zdefiniowanej wcześniej nazwie (Channel(CHANNEL_NAME)) wiadomość ze zmiennej "msg" do wszystkich osób na kanale
  148.             bot.Channel(CHANNEL_NAME).msg msg
  149.         # Kończy sprawdzanie, czy użytkownik jest BOT_NAMEistratorem
  150.         end
  151.     # Zakańcza funkcję wysyłającą wiadomość
  152.     end
  153.  
  154.     # Określa to co ma się dziać po wysłaniu określonej wiadomości (:message) (w tym wypadku tą wiadomością jest wyrażenie regularne, zdefiniowane jako REGEX__WOLFRAM) i tworzy nową zmienną |m|
  155.     on :message, REGEX__WOLFRAM do |m|
  156.         # Tworzy nową zmienną o nazwie "query", która sprawdza wiadomość za pomocą wyrażenia regularnego, umieszczoną w zmiennej "m", przypisanej do wysyłanej wiadomości (REGEX__WOLFRAM.match(m.message)) i przechwytuje zapytanie [:query]
  157.         query = REGEX__WOLFRAM.match(m.message)[:query]
  158.         # Tworzy nową zmienną o nazwie "result", pobierającą zapytanie ze zmiennej "query"
  159.         result = Wolfram.fetch(query)
  160.         # Wysyła wiadomość do wszystkich użytkowników na czacie (m.reply) zawartość zmiennej "result", przekształcając ją tak do ciągu znaków (inspect)
  161.         m.reply result.inspect
  162.     # Zakańcza funkcję wysyłającą wiadomość
  163.     end
  164. # Kończy definiować funkcję "bot" jako nowego bota frameworka Cinch
  165. end
  166.  
  167. # Uruchamia bota
  168. bot.start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement