Advertisement
ijontichy

basebot.py

Feb 22nd, 2014
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.84 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. # -*- coding: utf-8 -*-
  4.  
  5. import threading
  6. import socket
  7. import time
  8. import os
  9. from . import botthread
  10. from . import irccommand
  11. from .listeners import (echolistener, argecholistener, pinglistener,
  12.                         selfnicklistener, nickfaillistener, versionlistener)
  13.  
  14. from functions import ansicodes
  15.  
  16. BASELOGDIR = os.path.abspath("../logs")
  17.  
  18. class BaseBot(botthread.BotThread):
  19.  
  20.     def __init__(self, server, port, master):
  21.  
  22.         super().__init__()
  23.  
  24.         self.server    = server
  25.         self.port      = port
  26.         self.socket    = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  27.         self.name      = "tichybot"
  28.         self.uName     = "tichybot"
  29.         self.rName     = "Tichy Bot"
  30.         self.essential = [
  31.                           pinglistener.PingListener(),
  32.                           nickfaillistener.NickFailListener(),
  33.                           selfnicklistener.SelfNickListener(),
  34.                           versionlistener.VersionListener(),
  35.                          ]
  36.  
  37.         self.listeners = [
  38.                           #echolistener.EchoListener(),
  39.                           argecholistener.ArgEchoListener()
  40.                          ]
  41.  
  42.         self.currentData = ""
  43.  
  44.         self.master = master
  45.  
  46.     #######
  47.     ###
  48.     ##  MAIN
  49.     ###
  50.     #######
  51.  
  52.  
  53.     def run(self):
  54.         self.connect()
  55.  
  56.         while not self.stopped:
  57.             data = self.receiveData()
  58.  
  59.             self.addToData(data)
  60.             newLines = self.getNewLines()
  61.  
  62.             for listener in self.essential + self.listeners:
  63.                 listener.process(newLines, self)
  64.  
  65.             if data.startswith("ERROR :Closing link:"):   # Connection ded :(
  66.                 self.remove()
  67.                 return
  68.  
  69.         self.quit("Quitting")
  70.  
  71.     #######
  72.     ###
  73.     ##  CONNECTING
  74.     ###
  75.     #######
  76.  
  77.  
  78.     def connect(self):
  79.         self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  80.         self.socket.connect( (self.server, self.port) )
  81.         self.socket.setblocking(False)
  82.  
  83.         nickSend = irccommand.IRCCommand("NICK", [], "")
  84.         userSend = irccommand.IRCCommand("USER", [self.uName, self.uName, "*"], self.rName)
  85.  
  86.         self.sendCommand(userSend)
  87.  
  88.         self.receiveData()
  89.  
  90.         nickSend = irccommand.IRCCommand("NICK", [self.name], "")
  91.         self.sendCommand(nickSend)
  92.  
  93.     #######
  94.     ###
  95.     ##  DATA
  96.     ###
  97.     #######
  98.  
  99.     def addToData(self, newData):
  100.         self.currentData += newData
  101.  
  102.     def getNewLines(self):
  103.         ret = self.currentData.rpartition("\n")
  104.  
  105.         self.currentData = ret[2]
  106.  
  107.         return ret[0]
  108.  
  109.  
  110.     #######
  111.     ###
  112.     ##  SOCKET
  113.     ###
  114.     #######
  115.  
  116.  
  117.     def receiveData(self, buf=2**16, timeout=0):
  118.  
  119.         try:
  120.             ret = self.socket.recv(buf, timeout)
  121.  
  122.         except socket.error:
  123.             ret = b""
  124.  
  125.         ret = ret.decode()
  126.         ret = ret.replace("\r\n", "\n")
  127.         ret2 = ""
  128.  
  129.         for char in ret:
  130.             if ord(char) <= 127:
  131.                 ret2 += char
  132.             else:
  133.                 ret2 += "?"
  134.  
  135.         return ret2
  136.  
  137.  
  138.     def sendCommand(self, commandObj):
  139.  
  140.         for listener in self.listeners:
  141.             listener.processAction(commandObj, self)
  142.  
  143.         data = str(commandObj) + "\n"
  144.         sData = bytes(data, encoding="utf-8")
  145.  
  146.         self.socket.send(sData)
  147.  
  148.     #######
  149.     ###
  150.     ##  MESSAGING
  151.     ###
  152.     #######
  153.  
  154.  
  155.     def sendMessage(self, data):
  156.  
  157.         if not data:
  158.             return
  159.  
  160.         dataSplit = data.partition(":")
  161.         dataList  = [i for i in dataSplit[0].split() if i]
  162.  
  163.         try:
  164.             command = dataList[0]
  165.             args    = dataList[1:]
  166.             message = dataSplit[2]
  167.         except:
  168.             self.log("Invalid command '{}'".format(data) )
  169.         else:
  170.             ircCommand = irccommand.IRCCommand(command, args, message)
  171.             self.sendCommand(ircCommand)
  172.  
  173.  
  174.     #######
  175.     ###
  176.     ##  LOGGING
  177.     ###
  178.     #######
  179.  
  180.     def writeToLog(self, line):
  181.         cTime      = time.gmtime()
  182.         cDate = time.strftime("%Y-%m-%d", cTime)
  183.  
  184.         logdir = BASELOGDIR
  185.         olddir = os.getcwd()
  186.  
  187.         try:
  188.             os.makedirs(logdir)
  189.         except OSError:
  190.             pass
  191.  
  192.         os.chdir(logdir)
  193.  
  194.         line = ansicodes.stripCodes(line)
  195.  
  196.         log = open(cDate + ".txt", "a")
  197.         log.write(line + "\n")
  198.         log.close()
  199.  
  200.         os.chdir(olddir)
  201.  
  202.  
  203.  
  204.     def log(self, line):
  205.         cTime      = time.gmtime()
  206.         cTimestamp = time.strftime("<%H:%M>", cTime)
  207.  
  208.         newline = "{} {}".format(cTimestamp, line)
  209.  
  210.         self.writeToLog(newline)
  211.         print(newline)
  212.  
  213.  
  214.     #######
  215.     ###
  216.     ##  EXITING
  217.     ###
  218.     #######
  219.  
  220.  
  221.     def quit(self, reason):
  222.         quitCommand = irccommand.IRCCommand("QUIT", [], reason)
  223.         self.sendCommand(quitCommand)
  224.  
  225.     def remove(self):
  226.         cTime      = time.gmtime()
  227.         cTimestamp = time.strftime("<%H:%M>", cTime)
  228.  
  229.         self.log("!!! Exiting")
  230.         del self
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement