summaryrefslogtreecommitdiffstats
path: root/fingerchange.py
diff options
context:
space:
mode:
authorJohannes Löthberg <johannes@kyriasis.com>2015-06-21 13:47:13 +0100
committerJohannes Löthberg <johannes@kyriasis.com>2015-06-21 13:47:13 +0100
commitf0e1653fc09984a16a80daa8198b8d04553025a6 (patch)
tree6d1b81aad08086ef273db27348c075f10506aa05 /fingerchange.py
parent51f25504da5281bb3ea5d75f2940f29faeffae37 (diff)
downloadfingerchange-f0e1653fc09984a16a80daa8198b8d04553025a6.tar.xz
Move script to src
Diffstat (limited to 'fingerchange.py')
-rwxr-xr-xfingerchange.py153
1 files changed, 0 insertions, 153 deletions
diff --git a/fingerchange.py b/fingerchange.py
deleted file mode 100755
index b34c009..0000000
--- a/fingerchange.py
+++ /dev/null
@@ -1,153 +0,0 @@
-#!/usr/bin/env python3
-
-from textwrap import fill, indent
-from bs4 import BeautifulSoup
-import requests
-import asyncio
-import json
-
-api_url = 'https://api.stackexchange.com/2.2/users/'
-
-
-def slice_dict(dict, slice):
- s_len = len(slice)
- return {key[s_len:]: value for key,value in dict.items()
- if key.startswith(slice)}
-
-
-def get_user_by_uid(site, uid):
- params = {
- 'site': site,
- 'filter': '!9YdnSA07B',
- }
- res = requests.get(api_url + str(uid), params=params)
- res = json.loads(res.text)
-
- return res['items'][0]
-
-
-def get_users_by_name(site, name=''):
- params = {
- 'site': site,
- 'inname': name,
- 'filter': '!9YdnSA07B',
- }
- res = requests.get(api_url, params=params)
- res = json.loads(res.text)
-
- return res['items']
-
-
-def format_url(url):
- return '<{}>'.format(url)
-
-
-def format_field(key, value=None, indent=1):
- if not value:
- return '{}:: {}\n'.format(' '*indent, key)
-
- return '{}:: {} {}\n'.format(' '*indent, key, value)
-
-
-def format_header(header, filler):
- header = str(header)
- header_len = len(header)
- filler_len = 80 - header_len - (3 + 2)
-
- msg = '{pre_fil} {header} {post_fil}\n'.format(**{
- 'pre_fil': filler * 3,
- 'header': header,
- 'post_fil': filler * filler_len,
- })
- return msg
-
-
-def format_rep_changes(user):
- changes = slice_dict(user, 'reputation_')
- msg = ''
- if changes['change_day'] > 0:
- msg += format_field('day', '+' + str(changes['change_day']), indent=3)
- if changes['change_quarter'] > 0:
- msg += format_field('quarter', '+' + str(changes['change_quarter']), indent=3)
- if changes['change_year'] > 0:
- msg += format_field('year', '+' + str(changes['change_year']), indent=3)
-
- if len(msg) > 0:
- msg = format_field('reputation changes') + msg
-
- return msg
-
-
-def format_user(user, long_output=True):
- msg = '\n'
- msg += format_header(user['account_id'], '=')
- msg += format_field('uid', user['user_id'])
- msg += format_field('name', user['display_name'])
- msg += format_field('reputation', user['reputation'])
- if 'location' in user:
- msg += format_field('location', user['location'])
-
- msg += format_field('profile', format_url(user['link']))
- if 'website_url' in user and len(user['website_url']) > 0:
- msg += format_field('website', format_url(user['website_url']))
-
- msg += format_rep_changes(user)
- msg += '\n'
-
- if long_output and 'about_me' in user and len(user['about_me']) > 0:
- msg += format_header('About User', '-') + '\n'
-
- soup = BeautifulSoup(user['about_me'])
- text = soup.get_text()
-
- lines = [ line for line in text.splitlines() if line.strip() ]
- for line in lines:
- msg += indent(fill(line), ' ') + '\n\n'
-
- return msg
-
-
-@asyncio.coroutine
-def handle_client(reader, writer):
- line = yield from reader.readline()
- line = line.decode('utf-8').strip()
-
- if '@' not in line:
- writer.write('Error: Username or site missing\n'.encode('utf-8'))
- writer.close()
- return
-
- user, site = line.split('@')
- if user.startswith('/W'):
- long_output = True
- user = user[3:]
- else:
- long_output = False
-
- try:
- uid = int(user)
- users = [get_user_by_uid(site, uid)]
- except ValueError:
- users = get_users_by_name(site, user)
-
- for user in users:
- if user['user_type'] == 'unregistered':
- continue
-
- msg = format_user(user, long_output)
- writer.write(msg.encode('utf-8'))
-
- writer.close()
-
-
-loop = asyncio.get_event_loop()
-
-coro = asyncio.start_server(handle_client, host='0.0.0.0', port=79, loop=loop)
-server = loop.run_until_complete(coro)
-
-try:
- loop.run_forever()
-except KeyboardInterrupt:
- server.close()
- loop.run_until_complete(server.wait_closed())
- loop.close()