-
Notifications
You must be signed in to change notification settings - Fork 3
/
example_bot.py
executable file
·153 lines (126 loc) · 5.96 KB
/
example_bot.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
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
import os
import botymcbotface.irc
# The server to connect to.
server = "irc.freenode.net"
# The main channel to join.
main_channel = "#BotyMcBotface"
# While we put other variables such as the server to connect to and
# the channel to join in vars directly in this file, doing the same
# with the bot's password would be a bad idea, seeing as how this file
# is publicly available on Github. So, read it from a local file
# instead (which never ends up on Github).
def load_var(var_name):
var = ""
try:
with open(os.path.join("private", var_name), "r") as f:
var = f.readline().strip()
except FileNotFoundError:
print("You need to put your bot's %s in a file called %s "
"in directory called private." % (var_name, var_name))
raise SystemExit
return var
# Use the above function, to load our nickname and password from
# files in the "private/" directory.
nickname = load_var("nickname")
password = load_var("password")
# Create the bot object (which is defined in the file
# botymcbotface/irc.py). If we set the debug_level to a value above
# zero, we get more information on what is happening with the protocol
# (the higher we set it, the more info we get). It's a useful way to
# learn how the IRC protocol works.
bot = botymcbotface.irc.IRCBot(nickname, password, debug_level=0)
# Connect to the server. This will also log in, and give the server
# our nickname and password. It will also join our main channel,
# which is stored in the main_channel variable.
bot.connect(server, main_channel)
# Join additional channels:
bot.join_channel("#bots")
# MAIN LOOP
# =========
while True:
# Get one message from the IRC server. The '5' is a timeout; If
# nothing happens on the server in 5 seconds, the get_msg()
# function will return None, giving us a chance to do stuff here
# periodically. Otherwise, we'd be stuck waiting for messages
# forever if there are none. This way, we can do something else
# every 5 seconds or so if we want.
msg = bot.get_msg(5)
# If we reached a timeout before getting a message, then no IRCMsg
# will have been returned (we will have gotten None instead). In
# that case, just loop round (back up to "while True") to wait
# another 5 seconds.
#
# If we wanted to do something in the background every 5 (or
# every X) seconds, this is where we'd do it, right before the
# continue statement.
#
# Now we check if we got a message from get_msg, or if it simply
# timed out:
if not msg:
continue
# Now, we have a sender, a msg_type, a channel and a msg_text. We
# can check these to decide what we want to do (if anything) with
# this message.
# The IRC protocol is weird. The message type "PRIVMSG" can mean
# two different things, depending on what "channel" is set to.
#
# 1. If "channel" is the same as the bot's nickname, then it is
# an actual private message.
#
# 2. Otherwise, it's an ordinary message on the channel
# specified in "channel".
# Let's handle actual private messages first:
if (msg.msg_type == "PRIVMSG" and msg.channel == nickname):
print("Private message: %s->%s: %s" % (msg.sender, msg.channel,
msg.msg_text))
# We've received a private message! Let's respond.
#
# Since we're calling privmsg() with the sender as the recipient
# (the first argument), what we send will also be an actual
# private message.
bot.privmsg(msg.sender, "Hello, I'm a bot skeleton. I can't really "
"do anything, I exist merely as an example of how "
"to write an IRC bot in Python that others can "
"extend if they want. Take a look at my code at "
"github.com/enfors/BotyMcBotface if you're "
"interested.")
# Now, let's handle ordinary channel messages:
if (msg.msg_type == "PRIVMSG" and msg.channel != nickname):
print("Channel message: %s @ %s: %s" % (msg.sender, msg.channel,
msg.msg_text))
# If we get a message of type JOIN, that means that the 'sender'
# joined the channel specified in 'channel'. So let's send this
# user a greeting! But we only want to do that in our own
# main_channel, not in other channels we may have joined. Also, by
# checking to make sure that msg.sender is not equal to our own
# nickname, the bot won't accidentally welcome itself to the
# channel when it joins.
if (msg.msg_type == "JOIN" and msg.channel == main_channel and
msg.sender != nickname):
bot.privmsg(msg.channel, "Hello %s, welcome to %s!" %
(msg.sender, msg.channel))
# If the person who joined is called "enfors", then let's make
# him or her an operator in this channel. Replace "enfors" with
# your own IRC name (not the bot's name) if you want. Please note
# that this will only work if the bot is a channel operator.
if (msg.sender.lower() == "enfors"):
bot.make_operator(msg.channel, msg.sender)
# Messages of type "PART" means that someone left a channel.
# Let's ask people who leave our main_channel to come back:
if (msg.msg_type == "PART" and msg.channel == main_channel and
msg.sender != nickname):
bot.privmsg(msg.sender, "Please come back to %s soon!" %
msg.channel)
# That's it!
#
# That wasn't very difficult, was it? Feel free to extend this simple
# skeleton with more functionality. For example, you could make it
# so that it's owner (you) can send it a private message to add a
# "friend", and have the bot instantly make all "friends" who join the
# channel get a greeting or perhaps operator status.
#
# Happy hacking!
#
# https://github.com/enfors/botymcbotface