Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Lisätty irc-botti, joka näyttää servulistauksen

  • Loading branch information...
commit 5b98b34b5c9945e0696907edcfab8df32ab2fb27 1 parent df1efd5
valtzu authored March 10, 2011
1  crc32creator.cb
... ...
@@ -1,4 +1,3 @@
1  
-// testicom
2 1
 
3 2
 Const UPDATER_URL$ = "http://netmatch.vesq.org/updater/"
4 3
 
14  tools/ircbot/botconfig.ini
... ...
@@ -0,0 +1,14 @@
  1
+
  2
+# täältä haetaan servulistaus
  3
+list_url = http://netmatch.vesq.org/reg/gss.php?botlisting
  4
+
  5
+# irc-asetukset
  6
+irc_server  = irc.elisa.fi
  7
+irc_port    = 6667
  8
+irc_user    = netmatch
  9
+irc_nick    = NetMatch,NetMatch_
  10
+irc_channel = #netmatch
  11
+irc_rname   = NetMatch botti
  12
+
  13
+# botti ei vastaa komentoihin näin monen sekunnin aikana komennon vastauksesta (alkeellinen floodiesto)
  14
+mincmdwait  = 5
227  tools/ircbot/netmatch.py
... ...
@@ -0,0 +1,227 @@
  1
+# -*- coding: utf-8 -*- 
  2
+
  3
+import socket 
  4
+import time 
  5
+import os
  6
+from time import time
  7
+from urllib import urlopen, quote
  8
+from datetime import date
  9
+
  10
+configFile    = "botconfig.ini"
  11
+
  12
+# Asetetaan hieman oletusarvoja, jos kaikkia tietoja ei löydäkään config-filusta
  13
+defaultServer = "irc.saunalahti.fi"
  14
+defaultPort   = 6667
  15
+defaultRName  = ""
  16
+defaultMinCmdWait = 4
  17
+
  18
+# Varmistetaan config-filun olemassaolo
  19
+if os.path.exists(configFile) == False:
  20
+	exitErr('Config file not found')
  21
+
  22
+
  23
+lastHandledMsg = 0
  24
+nickId = 0
  25
+
  26
+print "reading config..."
  27
+
  28
+# asetusten luku alkaa
  29
+try:
  30
+	f=open(configFile, 'r')
  31
+	configData = f.read()
  32
+	f.close()
  33
+except:
  34
+	f.close()
  35
+	exitErr("wtf just happened")
  36
+
  37
+cLines = configData.split('\n')
  38
+settings = {}
  39
+for cLine in cLines:
  40
+	if cLine.startswith('#')==False and cLine.find('=')>0:
  41
+		part = cLine.split('=')
  42
+		name = part[0].strip().lower()
  43
+		value= part[1].strip()
  44
+		if name=='irc_nick':
  45
+			settings[name] = value.split(',')
  46
+		else:
  47
+			settings[name] = value
  48
+
  49
+if settings.has_key('irc_nick') == False:
  50
+	exitErr('No irc nick set in the config file')
  51
+if settings.has_key('irc_user') == False:
  52
+	exitErr('No irc user set in the config file')
  53
+if settings.has_key('irc_channel') == False:
  54
+	exitErr('No irc channel set in the config file')
  55
+if settings.has_key('list_url') == False:
  56
+	exitErr('No url for the bot listing set in the config file')
  57
+	
  58
+minCmdWait = int(settings.get('mincmdwait',defaultMinCmdWait))
  59
+
  60
+# asetusten luku päättyy
  61
+
  62
+
  63
+
  64
+# tulostaa virheen ja lopettaa ohjelman
  65
+def exitErr(msg):
  66
+	print msg
  67
+	exit()
  68
+
  69
+# lähettää viestin kanavalle parametrit (kanava, viesti) 
  70
+def sendm(ch, msg): 
  71
+    send('PRIVMSG '+ch+' :'+msg)
  72
+
  73
+# lähettää raakadataa servulle ja loppuun rivinvaihdon
  74
+def send(msg):
  75
+	sckIrc.send(msg+"\r\n")
  76
+	#print msg
  77
+
  78
+# liittyy kanavalle :O
  79
+def join(ch):
  80
+	send("JOIN "+ch)
  81
+
  82
+# poistuu kanavalta :o
  83
+def part(ch):
  84
+	send("PART "+ch)
  85
+
  86
+# yrittää asettaa nickin, lopettaa ohjelman jos vapaata nikkiä ei löydy
  87
+def trySetNick():
  88
+	global nickId
  89
+	if nickId < len(settings['irc_nick']):
  90
+		send('NICK '+ settings['irc_nick'][nickId])
  91
+	else:
  92
+		exitErr("Nickname already in use")
  93
+
  94
+
  95
+# muodostetaan yhteys irc-palvelimeen
  96
+sckIrc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  97
+sckIrc.connect((settings.get('irc_server', defaultServer), int(settings.get('irc_port',defaultPort)))) 
  98
+
  99
+send('USER '+settings.get('irc_user')+' 0 0 :'+settings.get('irc_rname',defaultRName)) 
  100
+trySetNick()
  101
+
  102
+words = []
  103
+
  104
+
  105
+# käsittelee yhden rivin irc-messagen
  106
+def processMessage(line):
  107
+	line = line.rstrip('\r\n')
  108
+	if len(line) == 0:
  109
+		return
  110
+	
  111
+	words = line.split(' ')
  112
+	
  113
+	
  114
+	serverMsg = True # kertoo onko viestin lähettäjä serveri vai joku muu
  115
+	
  116
+	# asetellaan messagen tiedot nätisti "taulukkoon"
  117
+	msg = {}
  118
+	o=0
  119
+	start=0
  120
+	if words[0].find(':') != -1:
  121
+		if words[0].find('!') == -1:
  122
+			msg['nick'] = words[0][1:]
  123
+			msg['host'] = msg['nick']
  124
+		else:
  125
+			msg['nick'] = words[0][1:words[0].find('!')]
  126
+			msg['host'] = words[0][:len(msg['nick'])+1]
  127
+			serverMsg   = False
  128
+		o += len(words[0])+1
  129
+		start = 1
  130
+	msg['param'] = []
  131
+	
  132
+	r = range(start,len(words))
  133
+	c=0
  134
+	for i in r:
  135
+		if c == 0:
  136
+			msg['cmd'] = words[i].lower()
  137
+		elif words[i].find(':')==0:
  138
+			msg['message'] = line[o+1:]
  139
+			break
  140
+		else:
  141
+			msg['param'].append(words[i])
  142
+		o += len(words[i])+1
  143
+		c += 1
  144
+	
  145
+	if serverMsg == False:
  146
+		# ohjataan viestit oikeaan osoitteeseen
  147
+		messageHandler.get(msg['cmd'], unhandledMessage)(msg)
  148
+	else:
  149
+		# palvelimen viestit käsitellään erikseen
  150
+		handleServerMsg(msg)
  151
+
  152
+
  153
+# käsittelee palvelimen viestit
  154
+def handleServerMsg(msg):
  155
+	if msg.has_key('cmd') == False:
  156
+		return
  157
+	
  158
+	if msg['cmd'] == 'ping':
  159
+		send('PONG :'+msg['message'])
  160
+	elif msg['cmd'] == '376':
  161
+		join(settings.get('irc_channel'))
  162
+	elif msg['cmd'] == '433':
  163
+		nickId += 1
  164
+		trySetNick()
  165
+
  166
+# tänne päätyvät kaikki paitsi serverin käsittelemättömät viestit
  167
+def unhandledMessage(msg):
  168
+	#print "unhandled message "+msg['cmd']
  169
+	pass
  170
+
  171
+# käsitellään privmsg:t eli normaalit irkissä puhumiset
  172
+def handlePrivMsg(msg):
  173
+	global lastHandledMsg, minCmdWait
  174
+	if (time()-lastHandledMsg)<minCmdWait:
  175
+		return
  176
+	ch=msg['param'][0]
  177
+	
  178
+	# jos kanava on sama kuin oma nikki (ollaan privassa) niin pitää tietysti vastata lähettäjälle
  179
+	if ch.lower() == settings.get('irc_nick')[nickId].lower():
  180
+		ch = msg['nick']
  181
+	
  182
+	m = msg['message']+" "
  183
+	
  184
+	# komentojen käsittely alkaa
  185
+	if m.startswith('!'):
  186
+		c = m[1:m.find(' ')]
  187
+		lastHandledMsg = time()
  188
+		if c == 'list':
  189
+			try:
  190
+				data = urlopen(settings.get('list_url')).read().strip()
  191
+				if data.startswith('GSS:')==False:
  192
+					return
  193
+				for srv in data[4:].split('\n'):
  194
+					d={}
  195
+					for exp in srv.split('|'):
  196
+						tmp = exp.split('=')
  197
+						if tmp[1].find(',')!=-1:
  198
+							tmp[1]=tmp[1].split(',')
  199
+						d[tmp[0]]=tmp[1]
  200
+					maxPl = int(d['info'][3])
  201
+					totPl = int(d['info'][0])
  202
+					botPl = int(d['info'][1])
  203
+					sendm(ch, "%s - %s - map:%s - players:%d(%d)/%d" % (d['name'], d['ver'], d['info'][2], (totPl-botPl), totPl, maxPl))
  204
+			except:
  205
+				sendm(ch,"Got error while getting server list :(")
  206
+
  207
+
  208
+# tällä ohjataan komennot oikeille funktioille
  209
+messageHandler = {'privmsg' : handlePrivMsg}
  210
+
  211
+print "probably connected to "+settings.get('irc_server', defaultServer)
  212
+
  213
+recv=''
  214
+# aloitetaan yhteyslooppi
  215
+while 1:
  216
+	recv+=sckIrc.recv(1024)
  217
+	
  218
+	# jos data ei lopu rivinvaihtoon, se jäi kesken, joten ei prosessoida sitä vielä
  219
+	if len(recv) == 0 or recv.endswith("\r\n") == False:
  220
+		continue
  221
+	
  222
+	if recv.find("\r\n") != False:
  223
+		for line in recv.split("\r\n"):
  224
+			processMessage(line)
  225
+	else:
  226
+		processMessage(line)
  227
+	recv=''

0 notes on commit 5b98b34

Please sign in to comment.
Something went wrong with that request. Please try again.