This repository has been archived by the owner on Sep 14, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
BarnameKon.py
208 lines (163 loc) · 9.69 KB
/
BarnameKon.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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
"""
Created on Mon Feb 1 22:41:45 2021
@author: anvaari
"""
import telebot
from flask import Flask,request
import os
from urllib.parse import quote as urldecode
from datetime import datetime as dt
from jdatetime import datetime as jdt
from dateutil import tz
from ics import Event,Calendar
def evligen(title,start_datetime,end_datetime,location,discription):
'''
This Function get data about event and return url for publish event and ics object
Parameters
----------
title : str
Title of event.
start_datetime : str
start date and time of envent in Jalali calendar. accepted format is : {Year}{Month}{Day}T{Hour}{Minute}
end_datetime : str
end date and time of envent in Jalali calendar. accepted format is : {Year}{Month}{Day}T{Hour}{Minute}
location : str
Location of event.
discription : str
Detail of event such as address of other info.
Returns
-------
tuple
Url for publishing event, calendar object
'''
c=Calendar()
e=Event()
e.name=title
e.description=discription
e.location=location
main_url='https://calendar.google.com/calendar/render?action=TEMPLATE&dates={}%2F{}&details={}&location={}&text={}' #for create link we must use this format
title=urldecode(title)
location=urldecode(location)
discription=urldecode(discription)
start_datetime=jdt.strptime(start_datetime,"%Y/%m/%d-%H:%M").togregorian()
start_datetime=dt(start_datetime.year,start_datetime.month,start_datetime.day,start_datetime.hour,start_datetime.minute) # Convert to datetime object because JalaliDateTime use earlier version of datetime and in that version timezone don't work properly.
start_datetime=start_datetime.replace(tzinfo=tz.gettz('Iran')).astimezone(tz=tz.gettz('UTC'))
e.begin=start_datetime.strftime("%Y-%m-%d %H:%M:%S")
start_datetime=start_datetime.strftime("%Y%m%dT%H%M%SZ") # Google calendar only accept this format.
end_datetime=jdt.strptime(end_datetime,"%Y/%m/%d-%H:%M").togregorian()
end_datetime=dt(end_datetime.year,end_datetime.month,end_datetime.day,end_datetime.hour,end_datetime.minute)
end_datetime=end_datetime.replace(tzinfo=tz.gettz('Iran')).astimezone(tz=tz.gettz('UTC'))
e.end=end_datetime.strftime("%Y-%m-%d %H:%M:%S")
end_datetime=end_datetime.strftime("%Y%m%dT%H%M%SZ")
c.events.add(e)
return main_url.format(start_datetime,end_datetime,discription,location,title),c
def feed_info_to_evligen(mes_text):
'''
This Function get text message entered by user and prepare it to feed in evligen function
Parameters
----------
mess_text : str
it must have special formated which mentioned in bot for user.
Returns
-------
tuple
Url for publishing event generated for input message, calendar object for creating ics file
'''
mes_text=mes_text.split('\n')
event_link=evligen(mes_text[1],mes_text[3],mes_text[4],mes_text[2],'\n'.join(mes_text[5:]))
return event_link
heroku_app_name='{}'.format(os.environ.get('h_a_n')) #Find it in your heruko dashboard
log_chat_id= int(os.environ.get('l_c_i')) #Chat Id which you want store log there
token = '{}'.format(os.environ.get('bot_token')) #Give it from @BotFather (Telegram)
bot=telebot.TeleBot(token)
sample_event_txt='رویداد\nمقدمه ای بر مصورسازی داده در پایتون\nskyroom\n1399/11/18-17:00\n1399/11/18-19:00\nبرای مشاهده رویداد در ساعت شروع آن به ادرس زیر مراجعه کنید:\nhttps://skyroom.online/datavisual'
sample_event=feed_info_to_evligen(sample_event_txt)
sample_event_link=sample_event[0]
sample_event_cal=sample_event[1]
# This part use for deploying
server = Flask(__name__)
PORT = int(os.environ.get('PORT', '8443'))
# Handle 'start' command
@bot.message_handler(commands=['start'])
def handle_start(message):
bot.reply_to(message, "سلام :) \n من (برنامه کُن!) اینجا هستم تا بتونی رویداد هایی رو که میبینی به تقویم هات اضافه کنی.\n برای اینکه بدونی چطوری کار میکنم /help رو وارد کن.")
bot.send_sticker(message.chat.id,'CAACAgQAAxkBAANKYCDnIB96YtMVvksVg9J5rCHu_lEAAtoBAAIhiDAI59nW5NwpahkeBA')
if message.chat.type == 'private':
bot.send_message(log_chat_id,'@{} Start. ID: {}\n'.format(message.from_user.username,message.chat.id))
else:
bot.send_message(log_chat_id,'@{} Start in {} group @{}\n'.format(message.from_user.username,message.chat.title,message.chat.username))
# Handle 'help' command
@bot.message_handler(commands=['help'])
def handle_help(message):
if message.chat.type=='private':
bot.send_message(message.chat.id,'برای دریافت لینک اضافه کردن به تقویم گوگل و فایل ics رویداد اطلاعات رویداد رو به فرمت زیر برای من بفرست:')
bot.send_message(message.chat.id,'رویداد \nعنوان رویداد\nمکان رویداد\nزمان و تاریخ شروع به فرمت پیام بعد\nزمان و تاریخ پایان به فرمت پیام بعد\nتوضیحات رویداد (شامل لینک و باقی توضیحات)')
bot.send_message(message.chat.id,sample_event_txt)
bot.send_message(message.chat.id,f'لینک اضافه کردن رویداد نمونه بالا به تقویم گوگل : \n{sample_event_link}')
with open('Your_Event.ics','w') as fp:
fp.writelines(sample_event_cal)
with open('Your_Event.ics','rb') as fp:
bot.send_message(message.chat.id,'فایل ics این رویداد ')
bot.send_document(message.chat.id, fp)
else:
bot.send_message(message.chat.id,'برای دریافت لینک اضافه کردن به تقویم گوگل و فایل ics رویداد اطلاعات رویداد رو به فرمت زیر به همین پیام Reply بزن :)')
bot.send_message(message.chat.id,'رویداد \nعنوان رویداد\nمکان رویداد\nزمان و تاریخ شروع به فرمت پیام بعد\nزمان و تاریخ پایان به فرمت پیام بعد\nتوضیحات رویداد (شامل لینک و باقی توضیحات)')
bot.send_message(message.chat.id,sample_event_txt)
bot.send_message(message.chat.id,f'لینک اضافه کردن رویداد نمونه بالا به تقویم گوگل : \n{sample_event_link}')
with open('Your_Event.ics','w') as fp:
fp.writelines(sample_event_cal)
with open('Your_Event.ics','rb') as fp:
bot.send_message(message.chat.id,'فایل ics این رویداد ')
bot.send_document(message.chat.id, fp)
# Handle text message
@bot.message_handler(content_types=['text'])
def handle_text(message):
if 'رویداد' in message.text :
try:
if message.chat.type=='private':
event=feed_info_to_evligen(message.text)
calendar=event[1]
event_link=event[0]
bot.send_message(message.chat.id,f'لینک رویداد شما :\n{event_link}')
with open('Your_Event.ics','w') as fp:
fp.writelines(calendar)
with open('Your_Event.ics','rb') as fp:
bot.send_message(message.chat.id,'فایل ics رویداد شما')
bot.send_document(message.chat.id, fp)
bot.send_message(log_chat_id,'@{} Create Link. ID: {}\n'.format(message.from_user.username,message.chat.id))
else:
event=feed_info_to_evligen(message.text)
calendar=event[1]
event_link=event[0]
bot.reply_to(message,f'لینک رویداد شما :\n{event_link}')
with open('Your_Event.ics','w') as fp:
fp.writelines(calendar)
with open('Your_Event.ics','rb') as fp:
bot.send_message(message.chat.id,'فایل ics رویداد شما')
bot.send_document(message.chat.id, fp)
bot.send_message(log_chat_id,'@{} Create Link in {} group @{}\n'.format(message.from_user.username,message.chat.title,message.chat.username))
except:
bot.send_message(message.chat.id,"غالب اطلاعات ارسالی درست نیست. لطفا یه نگاهی به راهنمای برنامه کُن بنداز : /help")
else:
bot.send_message(message.chat.id,"غالب اطلاعات ارسالی درست نیست. لطفا یه نگاهی به راهنمای برنامه کُن بنداز : /help")
# Handle sticker message
@bot.message_handler(content_types=['sticker'])
def handle_stickers(message):
bot.send_message(message.chat.id,'این یکی بهتره ;)')
bot.send_sticker(message.chat.id,'CAACAgQAAxkBAANKYCDnIB96YtMVvksVg9J5rCHu_lEAAtoBAAIhiDAI59nW5NwpahkeBA')
# This part use for deploying
@server.route('/' + token, methods=['POST'])
def getMessage():
bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))])
return "!", 200
@server.route("/")
def webhook():
bot.remove_webhook()
bot.set_webhook(url=f'https://{heroku_app_name}.herokuapp.com/' + token)
# Uncomment below and comment above if you wanna deploy locally
#bot.set_webhook(url="Your ngrok url which start with 'https' and end with 'ngrok.io/'" + token)
return "!", 200
if __name__ == "__main__":
server.run(host="0.0.0.0", port=int(os.environ.get('PORT', 5000)))
# Uncomment below and comment above if you wanna deploy locally
#server.run(host="localhost", port=int(os.environ.get('PORT', 5000)))