Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
EC Hackers
DiscordBots
Commits
02cc6b41
Commit
02cc6b41
authored
Oct 05, 2020
by
IS1_4M
Browse files
Added automated daily mailing functionality
parent
52f7874b
Changes
3
Hide whitespace changes
Inline
Side-by-side
TestBot/Community_Build_Bot/BottyBuildMain.py
View file @
02cc6b41
...
...
@@ -6,8 +6,9 @@ Created on Sat Sep 5 14:09:29 2020
"""
import
discord
from
discord.ext
import
commands
,
tasks
import
smtplib
,
ssl
from
datetime
import
datetime
from
datetime
import
datetime
,
timedelta
from
random
import
random
from
asyncio
import
create_task
,
sleep
,
run
...
...
@@ -15,6 +16,7 @@ from PublicChannel import PubChanSuite, PublicChan
from
ClubChannel
import
ClubSuite
,
Club
from
restrictedchannel
import
RestrictChan
,
RestrictChanSuite
from
handles
import
User
,
ECMember
,
ECStudent
,
ECFaculty
,
Organizer
,
Convener
,
Admin
,
SuperAdmin
from
test_get_mail
import
get_today_at_school
import
json
def
get_member_by_discord_name
(
guild
,
discord_name
):
...
...
@@ -45,8 +47,8 @@ account_password = credentials['email_password']
clubs
=
[]
users
=
[]
client
=
discord
.
Client
()
#
client = discord.Client()
client
=
commands
.
Bot
(
'!'
)
async
def
make_new_member
(
member
):
new_member
=
User
(
member
.
guild
,
member
)
...
...
@@ -54,6 +56,53 @@ async def make_new_member(member):
users
.
append
(
new_member
)
return
new_member
# I need a var section big time so i can call for updates
# THIS NEEDS PRIORITY UPDATES
@
tasks
.
loop
(
hours
=
24
)
async
def
update_today_at_schools
():
try
:
print
(
'invoked update functionm'
)
# ASSUME THE GUILD IS EARLHAM COLLEGe
print
(
client
.
guilds
)
for
guild
in
client
.
guilds
:
print
(
'searching guild:'
,
guild
.
name
)
today_at_school
=
None
today_at_virtual_school
=
None
virtual_annoucements
,
local_annoucements
=
get_today_at_school
(
send_account_email
,
account_password
)
for
channel
in
guild
.
channels
:
print
(
channel
.
name
)
print
(
'
\t
'
,
channel
.
name
==
'today-at-earlham'
,
channel
.
name
==
'today-at-remote-earlham'
)
if
channel
.
name
==
'today-at-earlham'
:
await
channel
.
send
(
'Today at Earlham '
+
str
(
datetime
.
today
())
+
':
\n\n
'
)
for
annoucement
in
local_annoucements
:
await
channel
.
send
(
annoucement
)
elif
channel
.
name
==
'today-at-remote-earlham'
:
await
channel
.
send
(
'Today at Remote Earlham '
+
str
(
datetime
.
today
())
+
':
\n\n
'
)
for
annoucement
in
virtual_annoucements
:
await
channel
.
send
(
annoucement
)
except
:
return
@
update_today_at_schools
.
before_loop
async
def
before_update_today_at_schools
():
print
(
'started update before loop'
)
hour
=
8
minute
=
5
await
client
.
wait_until_ready
()
print
(
'check1'
)
now
=
datetime
.
now
()
future
=
datetime
(
now
.
year
,
now
.
month
,
now
.
day
,
hour
,
minute
,
0
)
#future = datetime.now() + timedelta(seconds=5)
print
(
'check2'
)
print
(
now
.
hour
,
hour
,
now
.
minute
,
minute
,
now
.
hour
>=
hour
,
now
.
minute
>
minute
)
if
now
.
hour
>=
hour
and
now
.
minute
>
minute
:
print
(
'adding a day'
)
future
+=
timedelta
(
days
=
1
)
print
(
'added a day'
)
print
((
future
-
now
).
seconds
)
print
(
'sleeping for (s): '
,
(
future
-
now
).
seconds
)
await
sleep
((
future
-
now
).
seconds
)
@
client
.
event
async
def
on_member_join
(
member
):
await
make_new_member
(
member
)
...
...
@@ -287,4 +336,5 @@ async def on_message(message):
# In meet & greet lobbies, link to games, shows,
# and movies after 15 min of people talking.
# We NEED to be able to host remote events. Convocation, Speaker events, and more
client
.
run
(
credentials
[
'bot_token'
])
\ No newline at end of file
update_today_at_schools
.
start
()
client
.
run
(
credentials
[
'bot_token'
])
TestBot/Community_Build_Bot/__pycache__/handles.cpython-37.pyc
View file @
02cc6b41
No preview for this file type
TestBot/Community_Build_Bot/test_get_mail.py
0 → 100644
View file @
02cc6b41
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 3 19:52:04 2020
@author: josep
"""
'''
Mail handler for today at earlham.
'''
import
imaplib
import
json
import
email
from
email.header
import
decode_header
import
webbrowser
import
os
from
datetime
import
datetime
with
open
(
'../../../ECHackersBotCreds/credentials.json'
)
as
file
:
credentials
=
json
.
load
(
file
)
account_email
=
'earlhamhackerscontrol@gmail.com'
account_password
=
credentials
[
'email_password'
]
daily_mail_from
=
'ejnislam18@gmail.com'
daily_mail_name
=
'[Today-at-Earlham] Daily Mailing'
annoucement_delimeter
=
'------------------------------'
months
=
[
'Jan'
,
'Feb'
,
'Mar'
,
'Apr'
,
'May'
,
'Jun'
,
'Jul'
,
'Aug'
,
'Sep'
,
'Oct'
,
'Nov'
,
'Dec'
]
def
get_today_at_school
(
account_email
,
account_password
,
daily_mail_from
=
'ejnislam18@gmail.com'
,
daily_mail_name
=
'[Today-at-Earlham] Daily Mailing'
,
annoucement_delimeter
=
'------------------------------'
):
# create an IMAP4 class with SSL
imap
=
imaplib
.
IMAP4_SSL
(
"imap.gmail.com"
)
# authenticate
imap
.
login
(
account_email
,
account_password
)
status
,
messages
=
imap
.
select
(
"INBOX"
)
# number of top emails to fetch
N
=
3
# total number of emails
messages
=
int
(
messages
[
0
])
announcements
=
[]
for
i
in
range
(
messages
,
messages
-
N
,
-
1
):
# fetch the email message by ID
res
,
msg
=
imap
.
fetch
(
str
(
i
),
"(RFC822)"
)
for
response
in
msg
:
if
isinstance
(
response
,
tuple
):
# parse a bytes email into a message object
msg
=
email
.
message_from_bytes
(
response
[
1
])
# decode the email subject
subject
=
decode_header
(
msg
[
"Subject"
])[
0
][
0
]
date
=
msg
.
get
(
'Date'
).
split
(
' '
)
day
,
month
,
year
=
int
(
date
[
1
]),
date
[
2
],
date
[
3
]
if
isinstance
(
subject
,
bytes
):
# if it's a bytes, decode to str
subject
=
subject
.
decode
()
# email sender
from_
=
msg
.
get
(
"From"
)
today
=
datetime
.
today
()
if
not
(
today
.
day
==
day
and
today
.
month
==
months
.
index
(
month
)
+
1
and
today
.
year
==
int
(
year
))
or
daily_mail_from
not
in
from_
or
daily_mail_name
not
in
subject
:
# and the date isn't today
continue
# if the email message is multipart
if
msg
.
is_multipart
():
# iterate over email parts
for
part
in
msg
.
walk
():
# extract content type of email
content_type
=
part
.
get_content_type
()
content_disposition
=
str
(
part
.
get
(
"Content-Disposition"
))
try
:
# get the email body
body
=
part
.
get_payload
(
decode
=
True
).
decode
()
except
:
pass
if
content_type
==
"text/plain"
and
"attachment"
not
in
content_disposition
:
# print text/plain emails and skip attachments
announcements
=
body
.
split
(
annoucement_delimeter
)
elif
"attachment"
in
content_disposition
:
pass
else
:
print
(
'isn
\'
t multipart'
)
# extract content type of email
content_type
=
msg
.
get_content_type
()
# get the email body
body
=
msg
.
get_payload
(
decode
=
True
).
decode
()
if
content_type
==
"text/plain"
:
# print only text email parts
pass
if
not
len
(
announcements
):
return
([],
[])
announcements
[
0
]
=
announcements
[
0
][
len
(
"'---------- Forwarded message ---------
\r\n
From: Earlham College <webeditor@earlham.edu>
\r\n
Date: Fri, Oct 2, 2020 at 8:01 AM
\r\n
Subject: [Today-at-Earlham] Daily Mailing
\r\n
To: <today-at-earlham@earlham.edu>
\r\n\r\n\r\n
Today@Earlham <http://earlham.edu/news/today/> for October 02, 2020
\r\n
View Online <http://earlham.edu/news/today/> Submit Announcement
\r\n
<http://earlham.edu/news/today/submit/>
\r\n
"
)
-
1
:]
remote_accessible_annoucements
=
[]
in_person_annoucements
=
[]
for
annoucement
in
announcements
:
annoucementl
=
annoucement
.
lower
()
if
'virtual'
in
annoucementl
or
'zoom'
in
annoucementl
or
'remote'
in
annoucementl
or
'online'
in
annoucementl
:
remote_accessible_annoucements
.
append
(
annoucement
)
else
:
in_person_annoucements
.
append
(
annoucement
)
imap
.
close
()
imap
.
logout
()
return
remote_accessible_annoucements
,
in_person_annoucements
[:
-
1
]
#print(get_today_at_school(account_email, account_password))
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment