2022-04-18 16:25:36 +02:00
"""
2023-03-22 15:18:11 +01:00
Setting up authentication :
2022-04-18 16:25:36 +02:00
1. Head to https : / / www . reddit . com / prefs / apps
2023-03-22 15:18:11 +01:00
2. Click " are you a developer? create an app... " on the button
3. Enter the name and description
4. Select " script " for the type
5. Enter " redirect uri " as " http://localhost:8080 "
2022-04-18 16:25:36 +02:00
6. Create file " credentials " with the format below
2023-03-22 15:18:11 +01:00
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ [ id ] < - Under " personal use script " │
│ [ secret ] │
│ [ username ] < - For flair access , must be a mod , Don ' t do this... │
│ [ password ] < - . . . if you don ' t know what you are doing. │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
2022-04-18 16:25:36 +02:00
2023-03-22 15:18:11 +01:00
Running :
1. Run the script
2. Input the next ID to use
3. Manually resolve errors in temp - atlas - manual . json
2023-06-15 16:22:35 +02:00
4. a . Use merge_out . py , or . . .
b . a . Copy temp - atlas . json entries into web / _js / atlas . js ( mind the edits ! )
b . Copy temp - read - ids . txt IDs into data / read - ids . txt
2022-04-18 16:25:36 +02:00
5. Create a pull request
"""
2023-06-15 16:22:35 +02:00
from praw import Reddit
from praw . models import Submission
2022-04-04 18:49:57 +02:00
import json
2022-04-05 12:55:45 +02:00
import time
2022-04-08 06:19:46 +02:00
import re
2022-04-08 01:52:00 +02:00
import traceback
2023-03-22 15:18:11 +01:00
from aformatter import format_all , validate
2023-06-15 16:22:35 +02:00
from pathlib import Path
import humanize
from datetime import datetime
import secrets
patches_dir = " ../data/patches/ "
Path ( patches_dir ) . mkdir ( parents = True , exist_ok = True )
def set_flair ( submission , flair ) :
if has_write_access and submission . link_flair_text != flair :
flair_choices = submission . flair . choices ( )
flair = next ( x for x in flair_choices if x [ " flair_text_editable " ] and flair == x [ " flair_text " ] )
submission . flair . select ( flair [ " flair_template_id " ] )
with open ( ' credentials ' , ' r ' ) as file :
credentials = file . readlines ( )
client_id = credentials [ 0 ] . strip ( )
client_secret = credentials [ 1 ] . strip ( )
username = credentials [ 2 ] . strip ( ) if len ( credentials ) > 3 else " "
password = credentials [ 3 ] . strip ( ) if len ( credentials ) > 3 else " "
reddit = Reddit (
client_id = client_id ,
client_secret = client_secret ,
username = username ,
password = password ,
user_agent = ' atlas_bot '
)
has_write_access = not reddit . read_only
if not has_write_access :
print ( " Warning: No write access. Post flairs will not be updated. Waiting 5 seconds... " )
# time.sleep(5)
print ( " Running... " )
existing_ids = [ ]
with open ( ' ../data/read-ids.txt ' , ' r ' ) as edit_ids_file :
for id in [ x . strip ( ) for x in edit_ids_file . readlines ( ) ] :
existing_ids . append ( id )
total_all_flairs = 0
count_dupe = 0
count_fail = 0
count_success = 0
count_total = 0
with open ( ' temp-atlas-manual.txt ' , ' w ' , encoding = ' utf-8 ' ) as FAIL_FILE :
submission : Submission
2023-06-16 13:01:00 +02:00
for submission in reddit . subreddit ( ' placeAtlas2 ' ) . new ( limit = 1000 ) :
2022-06-11 18:39:10 +02:00
total_all_flairs + = 1
2023-06-15 16:22:35 +02:00
print ( f " { submission . id } : Submitted { humanize . naturaltime ( datetime . utcnow ( ) - datetime . utcfromtimestamp ( submission . created_utc ) ) } . " )
# print(patches_dir + 'reddit-' + submission.id + '.json')
if submission . id in existing_ids or Path ( patches_dir + ' reddit- ' + submission . id + ' .json ' ) . is_file ( ) :
2022-06-11 18:39:10 +02:00
set_flair ( submission , " Processed Entry " )
2023-06-15 16:22:35 +02:00
print ( f " { submission . id } : Submission is a duplicate! Skipped. " )
if ( count_dupe == 1 ) :
print ( f " { submission . id } : Second duplicate. Stopped! " )
2022-06-11 18:39:10 +02:00
break
2023-06-15 16:22:35 +02:00
print ( f " { submission . id } : First duplicate. Continue running. " )
count_dupe + = 1
continue
print ( f " { submission . id } : Processing... " )
2022-06-11 18:39:10 +02:00
2023-06-15 16:22:35 +02:00
if submission . link_flair_text == " New Entry " or submission . link_flair_text == " Edit Entry " or True :
2022-06-11 18:39:10 +02:00
try :
text = submission . selftext
rawtext = text
text = text . replace ( ' \u200c ' , ' ' )
text = re . compile ( r " ( \ { .+ \ }) " , re . DOTALL ) . search ( text ) . group ( 0 )
# Test if it needs to escape the escape character. Usually happens on fancy mode.
try : json . loads ( text )
except json . JSONDecodeError : text = re . sub ( r " \\ (.) " , r " \ 1 " , text )
submission_json = json . loads ( text )
if submission_json :
if submission . link_flair_text == " Edit Entry " :
2023-04-25 08:42:18 +02:00
assert submission_json [ " id " ] > 0 , " Edit invalid because ID is tampered, it must not be 0 or -1! "
2022-06-11 18:39:10 +02:00
else :
2023-04-25 08:42:18 +02:00
assert submission_json [ " id " ] < = 0 , " Addition invalid because ID is tampered, it must be 0 or -1! "
2023-06-15 16:22:35 +02:00
submission_json_dummy = { " id " : submission_json [ " id " ] , " _reddit_id " : submission . id , " _author " : submission . author . name }
2022-06-11 18:39:10 +02:00
for key in submission_json :
if not key in submission_json_dummy :
2022-12-31 21:13:56 +01:00
submission_json_dummy [ key ] = submission_json [ key ]
2022-06-11 18:39:10 +02:00
submission_json = format_all ( submission_json_dummy , True )
validation_status = validate ( submission_json )
assert validation_status < 3 , \
" Submission invalid after validation. This may be caused by not enough points on the path. "
2023-06-15 16:22:35 +02:00
with open ( f ' { patches_dir } reddit- { submission . id } - { " - " . join ( submission [ " name " ] . split ( ) ) . lower ( ) } .json ' , ' w ' , encoding = ' utf-8 ' ) as out_file :
out_file . write ( json . dumps ( submission_json , ensure_ascii = False ) )
2022-06-11 18:39:10 +02:00
2023-06-15 16:22:35 +02:00
count_success + = 1
2022-06-11 18:39:10 +02:00
set_flair ( submission , " Processed Entry " )
except Exception as e :
FAIL_FILE . write (
" \n \n " + " = " * 40 + " \n \n Submission ID: " +
submission . id + " \n \n " +
traceback . format_exc ( ) + " \n \n " +
" ==== RAW ==== " + " \n \n " +
rawtext + " \n \n "
" ==== CLEAN ==== " + " \n \n " +
text + " \n \n "
)
2023-06-15 16:22:35 +02:00
count_fail + = 1
2022-06-11 18:39:10 +02:00
set_flair ( submission , " Rejected Entry " )
2023-06-15 16:22:35 +02:00
print ( f " { submission . id } : Something went wrong! Rejected. " )
2022-06-11 18:39:10 +02:00
2023-06-15 16:22:35 +02:00
count_total + = 1
print ( f " { submission . id } : Processed! " )
2022-04-06 21:47:46 +02:00
2023-06-15 16:22:35 +02:00
print ( f " \n \n Total all flairs: { total_all_flairs } \n Success: { count_success } / { count_total } \n Fail: { count_fail } / { count_total } \n Please check temp-atlas-manual.txt for failed entries to manually resolve. " )