
    5i-                        S SK JrJrJrJrJrJrJrJrJ	r	  S SK
Jr  S SKJr  S SKrS SKrS SKJr  \" 5         \" \5      r\R&                  R)                  SS5      \R*                  S'   S\R*                  S	'   S
\R*                  S'   \R&                  R)                  SS5      \R*                  S'   \" \5      r " S S\R.                  5      r " S S\R.                  5      r\R5                  5          \R7                  5         SSS5        0 rS1r\R<                  S 5       rS-S jr \RC                  S5      S 5       r"\RC                  SS/S9S 5       r#\RC                  SS/S9S 5       r$\RC                  SS/S9S  5       r%\RC                  S!5      S" 5       r&S S#K J'r'  \RC                  S$5      S% 5       r(\RC                  S&5      S' 5       r)\S(:X  a  \RU                  S)S*S+S,9  gg! , (       d  f       N= f).    )	Flaskrender_templaterequestredirecturl_forflashsessionabortjsonify)
SQLAlchemy)datetimeN)load_dotenv
SECRET_KEYdev_key_for_weedthoughtzsqlite:///weedthought.dbSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONSOPENCLAW_API_KEYchange_this_to_a_secure_keyAPI_KEYc                       \ rS rSr\R                  \R                  SS9r\R                  \R                  S5      SS9r	\R                  \R                  \R                  S9rS rS	rg
)Story   Tprimary_key,  F)nullabledefaultc                 "    SU R                    S3$ )Nz<Story >)id)selfs    */home/webadmin/html/weedthought.com/app.py__repr__Story.__repr__   s    	##     N)__name__
__module____qualname____firstlineno__dbColumnIntegerr!   StringcontentDateTimer   utcnow
created_atr$   __static_attributes__r'   r&   r#   r   r      sQ    	2::4	0Bii		#i7G2;;@J$r&   r   c                      \ rS rSr\R                  \R                  SS9r\R                  \R                  S5      SSS9r	\R                  \R                  S5      5      r
\R                  \R                  \R                  S9rS	rg
)BannedIP   Tr   2   F)uniquer      r   r'   N)r(   r)   r*   r+   r,   r-   r.   r!   r/   
ip_addressreasonr1   r   r2   	banned_atr4   r'   r&   r#   r6   r6      sd    	2::4	0B299R=FJYYryy~&F		"++x	?Ir&   r6   z	127.0.0.1c                      [         R                  [        ;   a  g [        R                  R                  [         R                  S9R                  5       (       a  [        SSS9  g g )Nr;   i  z3Your IP has been banned due to suspicious activity.)description)r   remote_addrWHITELISTED_IPSr6   query	filter_byfirstr
   r'   r&   r#   check_bannedrF   )   sK    o-~~7+>+>?EEGGcTU Hr&   c                    U [         ;   a  g[        R                  U S5      U-   nU[        U '   US:  a  [        R                  R                  U S9R                  5       (       dZ  [        R                  R                  [        XS95        [        R                  R                  5         [        R                  U S 5        gg)NFr      r?   )r;   r<   T)rB   
IP_STRIKESgetr6   rC   rD   rE   r,   r	   addcommitpop)ipr<   weightcurrent_strikess       r#   penalize_iprQ   1   s    	_ nnR+f4O$JrN !~~''2'6<<>>JJNN8rABJJNN2t$r&   /c                     [         R                  R                  [         R                  R	                  5       5      R                  5       n [        R                  " SS5      n[        R                  " SS5      nX-   [        S'   SU SU S3n[        R                  " 5       R                  5       [        S'   [        SXS	9$ )
N   
   captcha_answerzWhat is z + ?form_start_timez
index.html)storiescaptcha_question)r   rC   order_byr3   descallrandomrandintr	   r   r2   	timestampr   )rY   num1num2rZ   s       r#   indexrc   B   s    kk""5#3#3#8#8#:;??AG >>!R D>>!R D $G!$s4&2 "*!2!<!<!>G<\\r&   z/postPOST)methodsc                     [         R                  " 5       R                  5       n [        R                  n[
        R                  " S5      nU(       a3  X-
  S:  a+  [        US5        [        S5        [        [        S5      5      $ [
        R                  " S5      nU(       a  X-
  S:  a+  [        US5        [        S	5        [        [        S5      5      $ [        R                  R                  S
5      (       a  [        USSS9  [        [        S5      5      $ [        R                  R                  S5      nU(       a8  UR                  5       (       a#  [        U5      [
        R                  " S5      :w  a+  [        US5        [        S5        [        [        S5      5      $ [        R                  R                  S5      nU(       d  [        S5        [        [        S5      5      $ [        U5      S:  a,  [        S[        U5       S35        [        [        S5      5      $ [        U5      S:  a,  [        S[        U5       S35        [        [        S5      5      $ [        US9n[         R
                  R#                  U5        [         R
                  R%                  5         U [
        S'   [        S5        [        [        S5      5      $ )Nlast_post_time<   zRate limit violationz*Please wait a minute before posting again.rc   rX   rH   zPosting too fastz0You are posting too fast. Please take your time.website_checkzHoneypot triggered)rO   captcharV   zCaptcha failedz(Incorrect math answer. Please try again.r0   zStory cannot be empty!   zStory is too short (z1 chars). It must be at least 140 characters long.r   zStory is too long (z) chars). It must be under 300 characters.r0   zStory posted successfully!)r   r2   r`   r   rA   r	   rJ   rQ   r   r   r   formisdigitintlenr   r,   rK   rL   )current_time	client_iprg   
start_timecaptcha_inputr0   	new_storys          r#   
post_storyrv   Q   s"   ??$..0L##I [[!12N<8B>I56:;()) ./J,3q8I12@A()) ||((I3A>()) LL$$Y/M 5 5 7 73};MQXQ\Q\]mQn;nI/089())lly)G&'())
7|c$S\N2cde())
7|c#CL>1Z[\())g&IJJNN9JJ ,G	
&'GG$%%r&   z/api/storiesGETc            	         [         R                  R                  S5      [        R                  S   :w  a  [        SS05      S4$ [        R                  R                  [        R                  R                  5       5      R                  S5      R                  5       n [        U  Vs/ s H5  nUR                  UR                  UR                  R                  5       S.PM7     sn5      $ s  snf )z1API endpoint for OpenClaw to read recent stories.	X-API-Keyr   errorUnauthorized  rU   )r!   r0   r3   )r   headersrJ   appconfigr   r   rC   r[   r3   r\   limitr]   r!   r0   	isoformat)rY   ss     r#   api_get_storiesr      s     ;'3::i+@@01366kk""5#3#3#8#8#:;AA"EIIKG 	 ! dd99ll,,. 	   s   %<C(z	/api/postc                     [         R                  R                  S5      [        R                  S   :w  a  [        SS05      S4$ [         R                  " 5       n U R                  S5      nU(       a  [        U5      S:  d  [        U5      S:  a  [        SS	05      S
4$ [        US9n[        R                  R                  U5        [        R                  R                  5         [        SUR                  S.5      S4$ )z*API endpoint for OpenClaw to post stories.ry   r   rz   r{   r|   r0   rk   r   z.Content must be between 140 and 300 charactersi  rl   zStory posted successfully)messager!      )r   r}   rJ   r~   r   r   get_jsonrp   r   r,   r	   rK   rL   r!   )datar0   ru   s      r#   api_post_storyr      s     ;'3::i+@@01366Dhhy!Gc'lS(CL3,>!QRSUXXXg&IJJNN9JJ:),,OPRUUUr&   z/story/<int:story_id>c                 T    [         R                  R                  U 5      n[        SUS9$ )Nz
story.html)story)r   rC   
get_or_404r   )story_idr   s     r#   
view_storyr      s#    KK""8,E<u55r&   )make_responsez/robots.txtc                  T    S[        SSS9-   n [        U 5      nSUR                  S'   U$ )Nz User-agent: *
Allow: /
Sitemap: sitemapT	_externalz
text/plainContent-Type)r   r   r}   )r0   responses     r#   robotsr      s3    2WYRV5WWGW%H'3H^$Or&   z/sitemap.xmlc                  h   [        SSS9n [        R                  R                  [        R                  R                  5       5      R                  5       n/ nUR                  S5        UR                  S5        UR                  S5        UR                  SU  S35        UR                  S	5        UR                  S
5        UR                  S5        U H  n[        SUR                  SS9nUR                  R                  S5      nUR                  S5        UR                  SU S35        UR                  SU S35        UR                  S5        UR                  S5        UR                  S5        M     UR                  S5        [        SR                  U5      5      nSUR                  S'   U$ )Nrc   Tr   z&<?xml version="1.0" encoding="UTF-8"?>z<<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">z<url>z<loc>z</loc>z<changefreq>daily</changefreq>z<priority>1.0</priority>z</url>r   )r   r   z%Y-%m-%dz	<lastmod>z
</lastmod>z<changefreq>never</changefreq>z<priority>0.8</priority>z	</urlset> zapplication/xmlr   )r   r   rC   r[   r3   r\   r]   appendr!   strftimer   joinr}   )base_urlrY   xmlr   urldater   s          r#   r   r      sg   w$/Hkk""5#3#3#8#8#:;??AG
CJJ78JJMN JJwJJxj'(JJ/0JJ)*JJx lUXXF((4

7

U3%v&'

YtfJ/0

34

-.

8  JJ{RWWS\*H'8H^$Or&   __main__Tz0.0.0.0i  )debughostport)rT   )+flaskr   r   r   r   r   r   r	   r
   r   flask_sqlalchemyr   r   osr^   dotenvr   r(   r~   environrJ   r   r,   Modelr   r6   app_context
create_allrI   rB   before_requestrF   rQ   routerc   rv   r   r   r   r   r   r   runr'   r&   r#   <module>r      s   d d d '  	   Ho::>>,8QR

< (B

$ %/4

+ ,

'9;XY

9 _$BHH $@rxx @ 	__MMO  
 -V V" 3] ] 7VH%0& &0&h >E7+
 ,
 ;)V *V  "#6 $6  =  > @ zGG$YTG2 g s   2G''
G5