1
- """
2
- Database abstraction layer for getting user modes in specified IRC channels
1
+ """Database connection for getting IRC user levels in IRC channels.
2
+
3
+ Uses sqlalchemy as database abstraction layer and the defined model here
3
4
4
- @version: beta 0.1
5
+ @version: 0.1
5
6
@author: moschlar
6
7
"""
7
8
9
+ DEBUG = 0
8
10
CONFIG_FILE = "testbot.cfg"
9
- path_to_db = "sqlite:///:memory:"
11
+
12
+ #-----------------------------------------------------------------------------------
13
+ # Parsing Database Configuration
14
+ #-----------------------------------------------------------------------------------
10
15
11
16
from ConfigParser import SafeConfigParser
12
17
config = SafeConfigParser ()
13
18
config .read (CONFIG_FILE )
14
19
15
- db_engine = config .get ("database" ,"engine" )
16
- db_server = config .get ("database" , "server" )
17
- user = config .get ("database" , "user" )
18
- passwd = config .get ("database" , "passwd" )
19
- db = config .get ("database" , "database" )
20
+ # Getting database information from CONFIG_FILE
21
+ try :
22
+ db_engine = config .get ("database" ,"engine" )
23
+ db_server = config .get ("database" , "server" )
24
+ user = config .get ("database" , "user" )
25
+ passwd = config .get ("database" , "password" )
26
+ db = config .get ("database" , "database" )
27
+ except :
28
+ raise Exception ("Could not read database path from %s" % CONFIG_FILE )
20
29
21
- # Parsing usable information from CONFIG_FILE
22
- if db_engine == "mysql" :
23
- path_to_db = "mysql ://"
30
+ # Parsing database information to path-string
31
+ try :
32
+ path_to_db = db_engine + " ://"
24
33
if user :
25
34
path_to_db += user
26
35
if passwd :
27
36
path_to_db += ":" + passwd
28
37
path_to_db += "@"
29
38
path_to_db += db_server + "/"
30
39
path_to_db += db
40
+ except :
41
+ raise Exception ("Could not parse path to database!" )
42
+
43
+ if DEBUG :
44
+ print path_to_db
45
+
46
+ #-----------------------------------------------------------------------------------
31
47
32
48
import socket
33
49
37
53
38
54
from sqlalchemy .ext .declarative import declarative_base
39
55
56
+ #-----------------------------------------------------------------------------------
57
+ # Declaring the database model
58
+ #-----------------------------------------------------------------------------------
59
+
40
60
Base = declarative_base ()
41
61
class irc (Base ):
42
62
__tablename__ = 'irc'
@@ -59,57 +79,64 @@ class host(Base):
59
79
lastmod = Column (Integer )
60
80
modby = Column (String )
61
81
82
+ #-----------------------------------------------------------------------------------
83
+
62
84
engine = create_engine (path_to_db , echo = False )
63
85
Session = sessionmaker (bind = engine )
64
86
session = Session ()
65
87
88
+ #-----------------------------------------------------------------------------------
89
+ # The only function that makes this class useful
90
+ #-----------------------------------------------------------------------------------
91
+
66
92
def getLevel (channel ,hostname ):
93
+ """Returns IRC user level from database.
94
+
95
+ The database model is used through sqlalchemy as defined above.
96
+ The first query tries to get an entry just by submitting the ip address,
97
+ the second query joins the host.zdvuser which has the given ip address with
98
+ irc.user.
99
+ """
67
100
level = "n"
68
- #print channel
101
+
102
+ if DEBUG :
103
+ print channel
69
104
if channel .startswith ("#" ):
70
105
channel = channel [1 :]
71
- #print hostname
106
+ if DEBUG :
107
+ print hostname
108
+
72
109
ip = socket .gethostbyname (hostname )
73
- #print ip
74
- q = session .query (irc .stat ).filter (irc .user == ip ).filter (irc .chan == channel ).first ()
75
- #print "q: %s"%q
110
+ if DEBUG :
111
+ print ip
76
112
113
+ q = session .query (irc .stat ).filter (irc .user == ip ).filter (irc .chan == channel ).first ()
77
114
if q :
115
+ if DEBUG :
116
+ print "User level by ip address: %s" % q
78
117
level = q [0 ]
79
118
80
- # USE JOINS
81
-
82
- p = session .query (host .zdvuser ).filter (host .ipv4 == ip ).first ()
83
- #print "p: %s"%p
119
+ # This SQL query shall be performed:
120
+ #
121
+ # SELECT irc.`stat` FROM `irc`
122
+ # LEFT JOIN `host` ON irc.`user` = host.`zdvuser`
123
+ # WHERE host.`ipv4` = 'ip' AND irc.`chan` = 'channel'
84
124
125
+ p = session .query (irc .stat ).join ((host , irc .user == host .zdvuser )).filter (host .ipv4 == ip ).filter (irc .chan == channel ).first ()
85
126
if p :
86
- p = p [0 ]
87
- r = session .query (irc .stat ).filter (irc .user == p ).filter (irc .chan == channel ).first ()
88
- #print "r: %s"%r
89
- if r :
90
- level = r [0 ]
127
+ if DEBUG :
128
+ print "User level by ZDV-Username: %s" % p
129
+ level = p [0 ]
91
130
92
131
return level
93
132
94
- def getChannelLevels (channel ):
95
-
96
- levels = {}
97
-
98
- #print channel
99
- if channel .startswith ("#" ):
100
- channel = channel [1 :]
101
-
102
- q = session .query (irc .user ,irc .stat ).filter (irc .chan == channel ).all ()
103
- #print q
104
-
105
- # Lets make a nice dictionary out of the tuples
106
- for (user ,mode ) in q :
107
- levels [user ] = mode
108
-
109
- return levels
133
+ #-----------------------------------------------------------------------------------
134
+ # And finally some test cases
135
+ #-----------------------------------------------------------------------------------
110
136
111
137
if __name__ == "__main__" :
138
+ print ("My level in #public: %c" % getLevel ("#public" ,"134.93.50.65" ))
139
+ print ("My level in #spielplatz: %c" % getLevel ("#spielplatz" ,"134.93.50.65" ))
112
140
#print getLevel("#public","stewie.k3.wohnheim.uni-mainz.de")
113
141
#print getLevel("#public","134.93.136.6")
114
142
#print getLevel("#k3","134.93.136.6")
115
- print getChannelLevels ("#public" )
0 commit comments