Skip to content

Commit 6b112d0

Browse files
eamanuchaosbot
authored andcommitted
merging PR #550: Re Reopen #443 according to #364 - Twitter Api Working
#550: Re Reopen #443 according to #364 - Twitter Api Working Description: Fix encryptation problems, regenerate twitter keys @PlasmaPower ✅ PR passed with a vote of 6 for and 0 against, a weighted total of 6.0 and a threshold of 6.0, and a current meritocracy review. Vote record: @Leigende: 1 @PlasmaPower: 1 @andrewda: 1 @eamanu: 1 @kylerschin: 1 @rudehn: 1
1 parent a5dd723 commit 6b112d0

14 files changed

+131
-7
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ server/issue_commands_ran.json
1919
.migrated
2020
ansible/*.retry
2121
db.sqlite
22+
*privkey

chaos.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import schedule
1212
import cron
1313
import shutil
14+
import datetime
1415

1516
# this import must happen before any github api stuff gets imported. it sets
1617
# up caching on the api functions so we don't run out of api requests
@@ -27,6 +28,11 @@
2728
# Currently imported just for the sideeffect (not currently being used)
2829
import encryption # noqa: F401
2930

31+
# To make post in Twitter
32+
import twitter_api as ta
33+
# import twitter_api.misc
34+
# import twitter_api.Twitter
35+
3036

3137
class LessThanFilter(logging.Filter):
3238
"""
@@ -69,12 +75,21 @@ def main():
6975

7076
api = gh.API(settings.GITHUB_USER, settings.GITHUB_SECRET)
7177

78+
# Api Twitter
79+
api_twitter = ta.API_TWITTER(settings.TWITTER_API_KEYS_FILE)
80+
7281
log.info("checking if I crashed before...")
82+
ta.Twitter.PostTwitter(datetime.datetime.ctime(datetime.datetime.now()) +
83+
" - checking if I crashed before...",
84+
api_twitter.GetApi())
7385

7486
# check if chaosbot is not on the tip of the master branch
7587
check_for_prev_crash(api, log)
7688

7789
log.info("starting up and entering event loop")
90+
ta.Twitter.PostTwitter(datetime.datetime.ctime(datetime.datetime.now()) +
91+
" - starting up and entering event loop",
92+
api_twitter.GetApi())
7893

7994
os.system("pkill uwsgi")
8095

@@ -86,7 +101,7 @@ def main():
86101
"--daemonize", "/root/workspace/Chaos/log/uwsgi.log"])
87102

88103
# Schedule all cron jobs to be run
89-
cron.schedule_jobs(api)
104+
cron.schedule_jobs(api, api_twitter)
90105

91106
log.info("Setting description to {desc}".format(desc=settings.REPO_DESCRIPTION))
92107
github_api.repos.set_desc(api, settings.URN, settings.REPO_DESCRIPTION)

cron/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from .poll_issue_close_stale import poll_issue_close_stale
77

88

9-
def schedule_jobs(api):
9+
def schedule_jobs(api, api_twitter):
1010
schedule.every(settings.PULL_REQUEST_POLLING_INTERVAL_SECONDS).seconds.do(
11-
lambda: poll_pull_requests(api))
11+
lambda: poll_pull_requests(api, api_twitter))
1212
schedule.every(settings.ISSUE_COMMENT_POLLING_INTERVAL_SECONDS).seconds.do(
1313
lambda: poll_read_issue_comments(api))
1414
schedule.every(settings.ISSUE_CLOSE_STALE_INTERVAL_SECONDS).seconds.do(

cron/poll_pull_requests.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44
import sys
55
from os.path import join, abspath, dirname
66
from lib.db.models import MeritocracyMentioned
7+
import datetime
78

89
import settings
910
import github_api as gh
1011

12+
from twitter_api import Twitter as tw
13+
1114
THIS_DIR = dirname(abspath(__file__))
1215

1316
__log = logging.getLogger("pull_requests")
1417

1518

16-
def poll_pull_requests(api):
19+
def poll_pull_requests(api, api_twitter):
1720
__log.info("looking for PRs")
1821

1922
# get voting window
@@ -93,7 +96,6 @@ def poll_pull_requests(api):
9396

9497
if is_approved:
9598
__log.info("PR %d status: will be approved", pr_num)
96-
9799
gh.prs.post_accepted_status(
98100
api, settings.URN, pr, seconds_since_updated, voting_window, votes, vote_total,
99101
threshold, meritocracy_satisfied)
@@ -104,13 +106,24 @@ def poll_pull_requests(api):
104106
try:
105107
sha = gh.prs.merge_pr(api, settings.URN, pr, votes, vote_total,
106108
threshold, meritocracy_satisfied)
109+
message_twitter = datetime.datetime.ctime(
110+
datetime.datetime.now()) +\
111+
" - PR {pr_num} approved for merging".format(pr_num=pr_num)
112+
tw.PostTwitter(message_twitter, api_twitter)
107113
# some error, like suddenly there's a merge conflict, or some
108114
# new commits were introduced between finding this ready pr and
109115
# merging it
116+
# Make a tweet
110117
except gh.exceptions.CouldntMerge:
111118
__log.info("couldn't merge PR %d for some reason, skipping",
112119
pr_num)
113120
gh.issues.label_issue(api, settings.URN, pr_num, ["can't merge"])
121+
message_twitter = datetime.datetime.ctime(
122+
datetime.datetime.now()) +\
123+
"Couldn't merge PR {pr_num} for some reason, \
124+
skipping".format(pr_num=pr_num)
125+
126+
tw.PostTwitter(message_twitter, api_twitter)
114127
continue
115128

116129
gh.comments.leave_accept_comment(

encryption.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ def decrypt(ciphertext):
4545
return decrypt
4646

4747

48-
decrypt = create_decryptor("/etc/privkey", "server/pubkey.txt")
48+
decrypt = create_decryptor("privkey", "server/pubkey.txt")

requirements.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ sh==1.12.13
2424
six==1.10.0
2525
flake8==3.3.0
2626
unidiff==0.5.4
27+
python-twitter==3.3
28+
pymysql
2729
hug==2.3.0
2830
uWSGI==2.0.15
29-
peewee
31+
peewee

settings.py

+15
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,21 @@
3838

3939
HOMEPAGE = "http://chaosthebot.com"
4040

41+
# To Twitter Posts
42+
_twitter_api_keys = 'api_twitter.keys'
43+
44+
# Look for local Keys first
45+
_twitter_api_keys_file = join(THIS_DIR, _twitter_api_keys)
46+
47+
# fall back to system twitter keys
48+
if not exists(_twitter_api_keys):
49+
_twitter_api_keys_file = join('/etc/', _twitter_api_keys)
50+
51+
if exists(_twitter_api_keys_file):
52+
TWITTER_API_KEYS_FILE = _twitter_api_keys_file
53+
else:
54+
TWITTER_API_KEYS_FILE = None
55+
4156
# TEST SETTING PLEASE IGNORE
4257
TEST = False
4358

twitter_api/Twitter.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
3+
log = logging.getLogger("twitter")
4+
5+
6+
def PostTwitter(message, api_twitter):
7+
if len(message) > 140:
8+
print('Post has more of 140 chars')
9+
api = api_twitter
10+
try:
11+
api.PostUpdate(message)
12+
except:
13+
log.exception("Failed to post to Twitter")
14+
return 0

twitter_api/__init__.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from . import misc
2+
import twitter
3+
4+
5+
__all__ = ["misc", "twitter"]
6+
7+
8+
class API_TWITTER():
9+
def __init__(self, path):
10+
self.__twitter_keys = misc.GetKeys(path)
11+
self.__api = twitter.Api(consumer_key=str(self.__twitter_keys['consumer_key']),
12+
consumer_secret=str(self.__twitter_keys['consumer_secret']),
13+
access_token_key=str(self.__twitter_keys['access_token']),
14+
access_token_secret=str(self.__twitter_keys['access_secret']))
15+
16+
def GetApi(self):
17+
return self.__api

twitter_api/misc.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from encryption import decrypt
2+
3+
4+
def GetKeys(twitter_keys_path):
5+
consumer_key = ''
6+
consumer_secret = ''
7+
access_token = ''
8+
access_secret = ''
9+
PATH = 'twitter_keys/'
10+
l_files = ['consumer_key', 'consumer_secret', 'access_token', 'access_secret']
11+
12+
for k in l_files:
13+
f = open(PATH + k, 'rb')
14+
key = f.read()
15+
if (k == 'consumer_key'):
16+
consumer_key = decrypt(key)
17+
if (k == 'consumer_secret'):
18+
consumer_secret = decrypt(key)
19+
if (k == 'access_token'):
20+
access_token = decrypt(key)
21+
if (k == 'access_secret'):
22+
access_secret = decrypt(key)
23+
f.close()
24+
"""
25+
for k in keys:
26+
try:
27+
values = k.split('\n')[0].split('=')[1].strip()
28+
if(k.split('\n')[0].split('=')[0].strip() == 'consumer_key'):
29+
consumer_key = decrypt(values)
30+
elif(k.split('\n')[0].split('=')[0].strip() == 'consumer_secret'):
31+
consumer_secret = decrypt(values)
32+
elif(k.split('\n')[0].split('=')[0].strip() == 'access_token'):
33+
access_token = decrypt(values)
34+
elif(k.split('\n')[0].split('=')[0].strip() == 'access_secret'):
35+
access_secret = decrypt(values)
36+
except IndexError:
37+
# Maybe there are a '\n' between keys
38+
continue
39+
40+
"""
41+
return {'consumer_key': consumer_key, 'consumer_secret': consumer_secret,
42+
'access_token': access_token, 'access_secret': access_secret}

twitter_keys/access_secret

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
�WÈ]p�\�E�}���3��N�|f${��j�&�c����4%�fCI�e}���C�[�/u��c��f�6�Hy�ު�6�M��ա\�8�����@ܸH�|��ą��1�/�C4cn�N���ORQ���m|h[���f�(�bY�D�7}��G(z-L�r��)�����Þ�"�F��J�]JN��v�i���nR�x�W}?:i��ׅv˸��<�uL��X@�����u�3KO�NVL��ڳ���f

twitter_keys/access_token

256 Bytes
Binary file not shown.

twitter_keys/consumer_key

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
9��Jl?p@LՄ �% �&��u�������:k{󕳩���VX������\�@<Gv�'�0!*&��6�<��3����rm�bO�$8�t��@���"�P�%� �6@���!(�􈕷�)�,���ߔ��N5��sN�p[�P���#a��䚣��J:!}M�_�d9��a�� �� �Խ:��I��[���Ie�VBE��_�}�k����c`����۵�M�Y
2+
�����/���2����g��

twitter_keys/consumer_secret

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2%�j��^kC��h��Gk��m��0�C�Η�x?�y������������G)�M� h)����t/�Ro�.�c�EW<��,Đn)�ۛ�{�K���:1�'3a3y��<�u��g������a'R"��V�i/�v�P�� Rvme�� ���EK&Z���>������q���3���A0����0����a��@�Y�L�?�P�"Y#�|=@�l�%c@_��f'��'Pp�
2+
4�6}��k�l

0 commit comments

Comments
 (0)