-
Notifications
You must be signed in to change notification settings - Fork 0
/
irc-client.py
173 lines (158 loc) · 5.55 KB
/
irc-client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
from sys import exit
import socket, threading, datetime, select, sys
import os
class start():
#Members
sock = None
host = "irc.freenode.net"
port = 6667
nick = "Banzaii"
identity = "Brans"
realname = "Grettir"
channel = None
#Initiate a connection
def __init__(self):
print "Welcome to Mega Irc Client 5000"
self.connect()
self.ident()
print "**** Press ENTER to write commands ****"
self.live()
#Keep the connection alive
def live(self):
i = 0
while True:
#Check for input in the pipes
r,w,e = select.select([sys.stdin, self.sock],[],[],1)
for c in r:
if isinstance(c, socket.socket):
#Deal with in coming data in socket
msg = self.sock.recv(4096)
self.log("server", msg)
if "PING :" in msg:
self.pong()
elif " PRIVMSG " in msg:
#Chop up and format private messages
pieces = msg.splitlines()
for p in pieces:
#ChopChop
tub = p.partition(':')
rest = tub[2]
tub = rest.partition('!')
sender = tub[0]
rest = tub[2]
tub = rest.partition(' ')
rest = tub[2]
tub = rest.partition(' ')
rest = tub[2]
tub = rest.partition(' :')
recvr = tub[0]
text = tub[2]
#Slap it back together
print '{' + sender + '}' + '@' + recvr + ': ' + text
else:
#Print messages from server to the user
print msg
else:
#Handle data from stdin
print "Enter command with / or say something in channel"
raw_input()
command = raw_input()
if command.startswith('/'):
#Handle as if a command from user
if "/exit" in command:
print command
self.die()
elif "/join" in command:
print command
self.joinChannel(command[6:])
elif "/part" in command:
print command
self.leaveChannel()
else:
print "No such command available"
elif self.channel:
#Handle as message to channel
self.say(command)
#Quit
def die(self):
self.sock.send("QUIT \r\n")
command = "Closing connection to %s" % self.host
print command
self.log("client", command)
msg = self.sock.recv(1024)
print msg
self.log("server", msg)
exit()
#Messages
def ident(self):
#Identify self to server
msg = self.sock.recv(1024)
print msg
self.log("server", msg)
command = "NICK %s\r\n" % self.nick
self.sock.send(command)
print command
self.log("client", command)
msg = self.sock.recv(1024)
print msg
self.log("server", msg)
command = "USER %s %s bla :%s\r\n" % (self.identity,self.host, self.realname)
self.sock.send(command)
print command
self.log("server", command)
def connect(self):
#Establis a connection to server
self.host = raw_input("\nType host name: ")
self.sock = socket.socket()
command = "Connecting to %s" % self.host
print command
self.log("client", command)
try:
self.sock.connect((self.host,self.port))
except:
command = "Failed to connect to %s" % self.host
print command
self.log("client", command)
exit()
def changeNick(self, newnick):
self.nick = newnick
command = "NICK %s\r\n" % self.nick
self.sock.send(command)
print command
self.log("client", command)
def pong(self):
msg = "PONG : Pong\r\n"
self.sock.send(msg)
print msg
self.log("client", msg)
def joinChannel(self, channelName):
command = "JOIN " + channelName + "\r\n"
self.sock.send(command)
print command
self.log("client", command)
self.channel = channelName
def leaveChannel(self):
command = "PART %s\r\n" % self.channel
self.sock.send(command)
print command
self.log("client", command)
self.channel = None
def say(self, message, receiver=None):
if not receiver:
receiver = self.channel
command = "PRIVMSG " + receiver + " : " + message + "\r\n"
self.sock.send(command)
print "@" + receiver + "[" + self.nick + "]" + " : " + message
self.log("client", command)
#Logging
def log(self,source,msg):
#Handle the logging needed
f = open("irc.log", "a+")
s = str(datetime.datetime.now()) + " : " + source + " : " + msg
f.write(s)
f.close()
if "posix" in os.name:
s = start()
else:
print "This client only works on linux"
exit()