moriyoshi (owner)

Revisions

gist: 217017 Download_button fork
public
Public Clone URL: git://gist.github.com/217017.git
Embed All Files: show embed
ft.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
# encoding: utf-8
 
from itertools import takewhile
import Skype4Py
import cjson as json
import urllib2
import datetime
import time
 
OUTPUT_ENCODING = 'UTF-8'
 
SERVICE_URI = 'http://api.jugemkey.jp/api/horoscope/free/%(year)04d/%(month)02d/%(day)02d'
 
ZODIACS = {
    u'牡羊座': ( (3, 21), (4, 20) ),
    u'牡牛座': ( (4, 21), (5, 21) ),
    u'双子座': ( (5, 22), (6, 21) ),
    u'蟹座': ( (6, 22), (7, 22) ),
    u'獅子座': ( (7, 23), (8, 22) ),
    u'乙女座': ( (8, 23), (9, 22) ),
    u'天秤座': ( (9, 23), (10, 23) ),
    u'蠍座': ( (10, 24), (11, 22) ),
    u'射手座': ( (11, 23), (12, 22) ),
    u'山羊座': ( (12, 23), (1, 20) ),
    u'水瓶座': ( (1, 21), (2, 19) ),
    u'魚座': ( (2, 20), (3, 20) ),
    }
 
def get_zodiac(d):
    nd = d.month * 31 + d.day
    for k, v in ZODIACS.iteritems():
        nv = [ _[0] * 31 + _[1] for _ in v ]
        if nv[0] < nv[1]:
            if nv[0] <= nd and nd <= nv[1]:
                return k
        else:
            if nv[0] <= nd and nd < 13 * 31:
                return k
            elif 0 <= nd and nd <= nv[1]:
                return k
    assert False
 
def fetch_astrogy_data(d):
    d = dict(year=int(d.year), month=int(d.month), day=int(d.day))
    s = urllib2.urlopen(SERVICE_URI % d)
    charset = 'utf-8'
    for i in s.headers.plist:
        i = i.split('=', 2)
        if len(i) == 2 and i[0].strip().lower() == 'charset':
            charset = i[1].strip()
    data = json.decode(unicode(s.read(), charset))['horoscope']['%(year)04d/%(month)02d/%(day)02d' % d]
    retval = {}
    for i in data:
        retval[i['sign']] = i
    return retval
 
def format_astrogy_entry(i):
    def stars(n):
        return u"★" * n + u"☆" * (5 - n)
    retval = u""
    retval += u"%d%s" % (i['rank'], i['sign'])
    retval += u"\n"
    retval += u"総合: %s" % stars(i['total'])
    retval += u"\n"
    retval += u"恋愛運: %s" % stars(i['love'])
    retval += u"\n"
    retval += u"金運: %s" % stars(i['money'])
    retval += u"\n"
    retval += u"仕事運: %s" % stars(i['job'])
    retval += u"\n"
    retval += u"ラッキーカラー: %s" % i['color']
    retval += u"\n"
    retval += i['content']
    retval += u"\n"
    return retval
 
if __name__ == "__main__":
    skype = Skype4Py.Skype(Transport='x11')
    def notifyEventHandler(message, status):
        if status in ('RECEIVED', 'READ'):
            if message.Body == "#uranai":
                birthday = message.Sender.Birthday
                print birthday
                if birthday:
                    message.Chat.SendMessage(format_astrogy_entry(fetch_astrogy_data(datetime.date.today())[get_zodiac(birthday)]).encode(OUTPUT_ENCODING))
                else:
                    message.Chat.SendMessage(u"プロフィールに誕生日が設定されていないようです")
            elif message.Body == "#uranai-ichiban":
                data = fetch_astrogy_data(datetime.date.today())
                a = [ (m, data[get_zodiac(m.Birthday)]) for m in message.Chat.Members if m != skype.User() and m.Birthday]
                a.sort(lambda a, b: cmp(a[1]['rank'], b[1]['rank']))
                msg = u"このチャットで今日一番運勢がいいのは以下の%sの皆さんです:\n" % a[0][1]['sign']
                for idx, (m, i) in enumerate(takewhile(lambda p: p[1]['rank'] == a[0][1]['rank'], a)):
                    if idx > 0:
                        msg += "、"
                    msg += u"%sさん" % m.FullName
                message.Chat.SendMessage(msg)
 
    skype.OnMessageStatus = notifyEventHandler
    skype.Attach()
    while True:
        time.sleep(1)