-
-
Notifications
You must be signed in to change notification settings - Fork 988
/
irc-notify.py
172 lines (138 loc) · 6.63 KB
/
irc-notify.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
"""
From: https://raw.githubusercontent.com/nexB/scancode-toolkit/48aeaf76ce9f53d02223c41c1b2ad1d1ad73b851/etc/scripts/irc-notify.py
Copyright (C) 2015-2016 Christopher R. Wood
This program is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this
program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301 USA.
Simple AppVeyor IRC notification script.
Modified by nexB on October 2016:
- rework the handling of environment variables.
- made the script use functions
- support only Appveyor loading its environment variable to craft IRC notices.
Modified by Jyrki Vesterinen on November 2016:
- join the channel instead of sending an external message.
The first argument is a Frenode channel. Other arguments passed to the script will be
sent as notice messages content and any {var}-formatted environment variables will be
expanded automatically, replaced with a corresponding Appveyor environment variable
value. se commas to delineate multiple messages.
Example:
export APPVEYOR_URL=https://ci.appveyor.com
export APPVEYOR_PROJECT_NAME=attributecode
export APPVEYOR_REPO_COMMIT_AUTHOR=pombredanne
export APPVEYOR_REPO_COMMIT_TIMESTAMP=2016-10-31
export APPVEYOR_REPO_PROVIDER=gihub
export APPVEYOR_REPO_BRANCH=repo_branch
export APPVEYOR_PULL_REQUEST_TITLE=pull_request_title
export APPVEYOR_BUILD_VERSION=1
export APPVEYOR_REPO_COMMIT=22c95b72e29248dc4de9b85e590ee18f6f587de8
export APPVEYOR_REPO_COMMIT_MESSAGE="some IRC test"
export APPVEYOR_ACCOUNT_NAME=nexB
export APPVEYOR_PULL_REQUEST_NUMBER=pull_request_number
export APPVEYOR_REPO_NAME=nexB/attributecode
python etc/scripts/irc-notify.py aboutcode '[{project_name}:{branch}] {short_commit}: "{message}" ({author}) {color_red}Succeeded','Details: {build_url} | Commit: {commit_url}'
See also https://github.com/gridsync/gridsync/blob/master/appveyor.yml for examples
in Appveyor's YAML:
on_success:
- "python etc/scripts/irc-notify.py channel [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_green}Succeeded,Details: {build_url},Commit: {commit_url}"
on_failure:
- "python etc/scripts/irc-notify.py channel [{project_name}:{branch}] {short_commit}: \"{message}\" ({author}) {color_red}Failed,Details: {build_url},Commit: {commit_url}"
"""
import os, random, socket, ssl, sys, time
def appveyor_vars():
"""
Return a dict of key value carfted from appveyor environment variables.
"""
from os import environ
appveyor_url = environ.get('APPVEYOR_URL')
message_extended = environ.get('APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED')
configuration_name = environ.get('CONFIGURATION')
branch = environ.get('APPVEYOR_REPO_BRANCH')
author = environ.get('APPVEYOR_REPO_COMMIT_AUTHOR')
author_email = environ.get('APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL')
timestamp = environ.get('APPVEYOR_REPO_COMMIT_TIMESTAMP')
repo_provider = environ.get('APPVEYOR_REPO_PROVIDER')
project_name = environ.get('APPVEYOR_PROJECT_NAME')
project_slug = environ.get('APPVEYOR_PROJECT_SLUG')
pull_request_title = environ.get('APPVEYOR_PULL_REQUEST_TITLE')
build_version = environ.get('APPVEYOR_BUILD_VERSION')
commit = environ.get('APPVEYOR_REPO_COMMIT')
message = environ.get('APPVEYOR_REPO_COMMIT_MESSAGE')
account_name = environ.get('APPVEYOR_ACCOUNT_NAME')
pull_request_number = environ.get('APPVEYOR_PULL_REQUEST_NUMBER')
repo_name = environ.get('APPVEYOR_REPO_NAME')
short_commit = commit[:7]
build_url = '{appveyor_url}/project/{account_name}/{project_slug}/build/{build_version}'.format(**locals())
commit_url = 'https://{repo_provider}.com/{repo_name}/commit/{commit}'.format(**locals())
vars = dict(
appveyor_url=appveyor_url,
account_name=account_name,
project_name=project_name,
project_slug=project_slug,
build_version=build_version,
build_url=build_url,
repo_provider=repo_provider,
repo_name=repo_name,
branch=branch,
configuration_name=configuration_name,
author=author,
author_email=author_email,
timestamp=timestamp,
commit=commit,
short_commit=short_commit,
message=message,
message_extended=message_extended,
pull_request_title=pull_request_title,
pull_request_number=pull_request_number,
commit_url=commit_url,
color_green='\x033',
color_red='\x034',
bold='\x02',
underline='\x1f',
plain='\x0f',
)
return vars
if __name__ == '__main__':
apvy_vars = appveyor_vars()
channel = sys.argv[1]
messages = sys.argv[2:]
messages = ' '.join(messages)
messages = messages.split(',')
messages = [msg.format(**apvy_vars).strip() for msg in messages]
irc_username = 'Appveyor'
irc_nick = irc_username + str(random.randint(1, 9999))
try:
# establish connection
irc_sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
irc_sock.connect((socket.gethostbyname('chat.freenode.net'), 6697))
irc_sock.send('NICK {0}\r\nUSER {0} * 0 :{0}\r\n'.format(irc_username).encode('utf_8'))
irc_file = irc_sock.makefile()
while irc_file:
line = irc_file.readline()
print(line.rstrip())
response = line.split()
if response[0] == 'PING':
irc_file.send('PONG {}\r\n'.format(reponse[1]).encode('utf_8'))
elif response[1] == '433':
irc_sock.send('NICK {}\r\n'.format(irc_nick).encode('utf_8'))
elif response[1] == '001':
time.sleep(5)
# join the channel
irc_sock.send('JOIN #{}\r\n'.format(channel).encode('utf_8'))
# send messages
for msg in messages:
print('PRIVMSG #{} :{}'.format(channel, msg))
irc_sock.send('PRIVMSG #{} :{}\r\n'.format(channel, msg).encode('utf_8'))
time.sleep(5)
# leave the channel
irc_sock.send('PART #{}\r\n'.format(channel).encode('utf_8'))
sys.exit()
except:
e = sys.exc_info()[0]
print(e)
sys.exit()