
wNc        .   @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d  d l
 Z
 yF d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d Z Wn d Z n Xy d  d l Z Wn n Xd Z d Z d Z d Z d Z d	 Z d
 e d Z i d d 6d d 6Z i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6Z i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d  d 6d! d 6d" d 6d d 6d d 6d d 6Z i d d# 6d d$ 6d d% 6d d& 6d d' 6d d( 6d d) 6d d* 6d d+ 6d d, 6d d- 6d d. 6d d/ 6d d0 6d d1 6d d2 6d d3 6d d4 6d d5 6d d6 6d d7 6d d8 6d d9 6d d: 6d d; 6d d< 6d d= 6Z d> d? d@ dA dB dC dD dE dF dG d7 dH dI dJ dK dL d d" dM d  d! dN dO dP g Z d d  d! d" dM d7 dH g Z dQ dR f dS dT f dU dV f dW dX f dY dZ f d[ d\ f d] d^ f d_ d` f da db f dc dd f de df f dg dh f di dj f dk dl f dm dn f do dp f dq dr f ds dt f du dv f dw dx f dy dz f d{ d| f d} d~ f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f d d f g- Z  d   Z! d d  Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d   Z* d   Z+ d   Z, d d  Z- d   Z. d   Z/ d   Z0 d   Z1 d e	 j2 f d     YZ3 d f  d     YZ4 d f  d     YZ5 d f  d     YZ6 d   Z7 d   Z8 d   Z9 d S(   iNi   i    s   1.9.1s9   Charm, a Python-based client for cross-platform blogging.s   evilhat@livejournal.coms   python-Charms   http://ljcharm.sourceforge.net/sN   ------------------------------------------------------------------------------s   
--------------[ Charm s3   , a Cross-Platform Blogging Client ]--------------
s   <a href="http://www.addthis.com/bookmark.php?url=%s&title=%s" title="Bookmark and Share" target="_blank"><img src="http://s9.addthis.com/button1-share.gif" width="125" height="16" border="0" alt="Bookmark and Share" /></a>t   addthiss  <script type="text/javascript"><!--
addthis_pub = '%s';
// --></script><a onclick="return addthis_sendto()" onmouseover="return addthis_open(this, '', '%s', '%s')" onmouseout="addthis_close()" href="http://www.addthis.com/bookmark.php"><img src="http://s7.addthis.com/static/btn/lg-share-en.gif" border="0" alt="Bookmark and Share" width="125" height="16" /></a><script src="http://s7.addthis.com/js/152/addthis_widget.js" type="text/javascript"></script>t
   addthis_jst   archivet   archive_editst   archive_overwritet   archive_subdirst   show_permissionst   nocachet   nologint
   autoformatt   commentst   noemailt   backdatet
   edit_timest
   autodetectt   debugt	   showpermst   prop_opt_preformattedt   prop_opt_nocommentst   prop_opt_noemailt   prop_opt_backdatedt   archive_dirt	   draft_dirt   organizet   editort   pagert   spellcheckert   usert   passwordt	   hpasswordt   logint   hlogint   atomblogt	   hatomblogt   metawebt   default_usert   socialt
   socialusert   groupheadert   commpict   tagpict   securityt   journalt   urlt   checkgroupst
   checkdelayt   default_filtert   default_templatet   yeart   mont   dayt   hourt   mint   eventt
   unfilteredt   subjectt
   usejournalt   postert	   allowmaskt   prop_current_moodt   prop_current_moodidt   prop_picture_keywordt   prop_current_musict   prop_opt_screeningt   prop_taglistt   prop_keywordst   excerpts   Red, Darkests   #5B0101s	   Red, Darks   #9E0000t   Reds   #FF0000s
   Red, Lights   #FF8B8Bs	   Red, Pinks   #FFCBCBs   Brown, Darks   #330000t   Browns   #993300s
   Brown, Tans   #CC9966s   Orange, Browns   #BC5D00s   Orange, Brights   #FF6600t   Oranges   #FFB22Bs   Orange, Lights   #FFE2A3t   Olives   #696A0As   Yellow, Darks   #B0B200t   Yellows   #FFFF00s   Yellow, Lights   #FEFFBBs   Green, Pines   #002400s   Green, Darks   #015B01t   Greens   #019501s   Green, Brights   #00FF00s   Green, Lights   #B3FFB3s   Green, Mints   #00EEC4s   Green, Aquas   #88FEE9s   Blue, Steels   #066D98s   Blue, Oceans   #019997s	   Blue, Skys   #00FFFFs   Blue, Light Skys   #BBFFFEs   Blue, Midnights   #00025Cs
   Blue, Navys   #01059Ds   Blue, Brights   #0000FFs   Blue, Mediums   #6569FFs   Blue, Lights   #ADB1FFs   Blue, Powders   #E3E5FFs   Violet, Darks   #8E01D7t   Violets   #CA65FFs   Violet, Lights   #EFCFFFs   Purple, Wines   #520155t   Purples   #A501A7s   Purple, Fuchsias   #FF00FFs   Purple, Pinks   #F999FFs	   Pink, Ices   #FCDDFFt   Blacks   #000000s
   Gray, Darks   #676767s   Gray, Lights   #C0C0C0t   Whites   #FFFFFFc           C   s   t  GHd t t f GHt  GHd S(   s   Print client information.s7  
Client ID: %s/%s

This cross-platform blogging client (for LiveJournal, the MetaWebLog API,
the Movable Type API, and the Atom API) was written by Lydia Leong.
Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008.
Terms of the GNU Public License apply.
The author can be reached at evilhat@livejournal.com
N(   t   barlinet   Client_Namet   __version__(    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   client_info   s    	s   Action: c         C   s.   y t  |   } Wn t k
 r) d } n X| S(   s   Handles EOF more gracefully.t    (   t	   raw_inputt   EOFError(   t   promptt   res(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   sane_raw_input   s
    
c         C   so   y. x' |  j    D] } d | |  | f GHq WWn: y x |  D] } t |  q> WWqk d GH|  GHqk Xn Xd S(   s   Dump contents of a dictionary.s   %s = %ss   Error dumping dictionary.N(   t   keyst	   dump_dict(   t	   this_dictt   kt   d(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyRX      s    c          C   s*   t  j   d }  |  d k r  d St |   S(   s   Return an error message.i   s   unknown errorN(   t   syst   exc_infot   Nonet   str(   t   s(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   errmsg   s    c         C   s(   |  d k r d S|  d k r  d Sd Sd S(   s6   Parse a boolean string, return 0 or 1, or -1 on error.t   yest   yt   truet   tt   ont   1i   t   not   nt   falset   ft   offt   0i    iN(   Rb   Rc   Rd   Re   Rf   Rg   (   Rh   Ri   Rj   Rk   Rl   Rm   (    (   t   instr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   parse_bool   s
    c         C   s|   t  j j |   sx y t  j |   Wn' t k
 rL d | |  t   f GHd SXy t  j |  d  Wqx t k
 rt qx Xn  d S(   s'   Create a directory if it doesn't exist.s$   Error creating '%s' directory %s: %si    i  i   (   t   ost   patht   existst   mkdirt   OSErrorRa   t   chmod(   t   dnamet   derr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   create_dir   s    c         C   s   t  |   } d | | } | d k r3 | d } n | d k rL | d } n  d } xp |  D]h } | | d k r d t |  d | |  f GHn( d	 t |  d t j | |  |  f G| d } qY W| | d k r Hn  d
 S(   s7   Print a list, numbered, in a certain number of columns.iN   ic   i   i	   i   i    s   %-4s %st   .s   %-4s %s N(   t   lenR_   t   stringt   ljust(   t   listt   n_colst   l_lent   widtht   iRZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   column_table   s     c          C   s*   t  g  t D] \ }  } |  ^ q
 d  d S(   s   Print a color table.i   N(   R   t   Colors(   RZ   t   v(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   color_table  s    c         C   s   xy t    Ht |   } Hy t |  } Wn t k
 rA d } n X| d k  s` | t t  k ri d GHHq t | d d Sq d S(   s%   Display and obtain color information.i    i   s   That is not a valid color.N(   R   RV   t   intt
   ValueErrorRz   R   (   RT   t   colnameRi   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   color_input
  s    
c         C   s^   y t  j |   } WnD t k
 rY t  j |   j   } t j t d   |  d  } n X| S(   s!   md5digest hex digestify a string.c         S   s0   d t  j t |   d t  j t |   d f S(   Ns   %s%si   (   R{   t	   hexdigitst   ord(   t   c(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   <lambda>'  s    RQ   (   t   md5t	   hexdigestt   AttributeErrort   newt   digestR{   t   joint   map(   t   sstrt   hexdR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   md5digest  s    "c         C   s-   t  j d |  t f  j   } d |  | f S(   s   Create a nonce.s   %s:%ss   %s %s(   t   shaR   RN   R   (   t   tstampR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   get_nonce,  s    c         C   s   t  j |  d  S(   s?   Create a comma-separated list string, out of a list of strings.s   , (   R{   R   (   R}   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   commalist3  s    s
    [...more]c         C   s*   t  j t  j |  |  d d  d d  | S(   s(   Truncate a string to a specified length.s   t    s   
(   R{   t   replace(   R_   Rz   t   more_str(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   truncstr_more9  s    c         C   s   |  d d k r# |  } |  d  }  n1 |  d d k rJ d |  } |  d  }  n
 |  d } |  d d k st |  d d k r d	 | | f S|  d
 d k s |  d
 d k r d | | f Sd | | f Sd S(   s@   Append a paragraph to an existing HTML text body. Return string.is   

is   
s   %s
is   <P>s   <p>s	   %s%s
<P>
is   </P>s   </p>s   %s<P>%s
</P>
s
   %s<P>

%s
N(    (   t   origR   t   tstr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   append_htblock@  s    

  c           C   s(   y t  j d SWn t k
 r# d SXd S(   s   Get user's home directory.t   HOMEs   /tmpN(   Rp   t   environt   KeyError(    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   get_home_dirT  s    c         C   sI   t  j   } | d d k r  |  Sy t |  d  j d  SWn |  SXd S(   s$   UTF-8 encode a string, if supported.i   t   UTF8s
   iso-8859-1s   UTF-8N(   t   localet   getdefaultlocalet   unicodet   encode(   R`   t   loc(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   utf8a  s    c         C   s>  g  } x%|  j    D]\ } } g  } x6 t j | d  D]" } | j t j | d d   q8 Wt j | d  } t j | d  } g  } xm | D]e } g  }	 x= | D]5 }
 |
 t j k r d t |
  }
 n  |	 j |
  q W| j t j |	 d   q Wt j | d  } | j d | | j	 d  f  q Wt j | d	  S(
   s;   Equivalent of urllib.urlencode(), but handles Unicode data.s   
s   
R   u   %%%02XRQ   t   +s   %s=%ss   us-asciit   &(
   t   itemsR{   t   splitt   appendR   R   t   urllibt   always_safeR   R   (   t   datat   outRZ   R   t   elemst   xt   wordst   enct   wRU   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   utf8_urlencoden  s$     $t   CustomURLopenerc           B   s   e  Z d    Z RS(   c         G   s   t  t j j |  f |  d  S(   N(   t   applyR   t   FancyURLopenert   __init__(   t   selft   args(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s    (   t   __name__t
   __module__R   (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s   t   BloggerDatac           B   s   e  Z d  Z d   Z RS(   s   Storage for Atom and MetaWeb data. Charm's code really needs general
       refactoring for LJ versus Atom at some point in the future, since
       this is a kludge.c         C   s1   d  |  _ i  |  _ i  |  _ d |  _ g  |  _ d  S(   NRQ   (   R^   t   Qt   Blogst   Currentt   PostTimet
   Categories(   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s
    				(   R   R   t   __doc__R   (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s   t   LJ_Cachec           B   sV   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(	   s   Server data cache.c         C   sg   i  |  _  d |  _ g  |  _ g  |  _ i  |  _ i  |  _ i  |  _ g  |  _ g  |  _ g  |  _	 d |  _
 d S(   s   Initialize.i    RQ   N(   t   Moodst
   Mood_Countt   Journalst   PicKwst   Friendst   FriendSortert
   FriendNumst   FriendPublict
   Irrelevantt   Tagst   LastSync(   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s    										c   
      C   sg  y t  | d  } Wn t k
 r' d SX| j   } x| d k rt j |  } | d k ra nt j | d d  } d | } t |  } | d d  d	 k r | d |  j | d d <n<| d |  | k r| d | d
 k r |  j j	 | d  q| d | d k r&|  j
 j	 | d  q| d | d k rQ|  j j	 | d  q| d | d  d k r| d |  j | d | d <q| d | d  d k r| d |  j | d | d <q| d | d k r| d |  _ qn |  j j	 |  | j   } q7 W| j   d |  _ xE |  j j   D]4 } t |  j |  }	 |	 |  j k r+|	 |  _ q+q+Wd S(   s   Load cache file.t   rNRQ   t   =i   s   %s i    i   t   mood_t   picR*   t   tagi   t   fg_i   t   ofg_t   lastsync(   t   opent   IOErrort   readlineR{   t   rstripR   Rz   R   R   R   R   R   R   R   R   R   t   closeR   RW   R   (
   R   t   fnamet   usernameRk   t   linet   inpairt   ustrt   ulenRZ   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   load_cache  sF    
  
	c         C   s  |  j  d k  r d St   } d | } t | d  } |  j d k ra | j d | |  j f  n  x5 |  j j   D]$ } | j d | |  j | f  qq Wx( |  j D] } | j d | | f  q Wx( |  j D] } | j d	 | | f  q Wx( |  j	 D] } | j d
 | | f  q Wx8 |  j
 j   D]' } | j d | | |  j
 | f  q*Wx8 |  j j   D]' } | j d | | |  j | f  qeWx" |  j D] } | j d |  qW| j   d S(   s   Save cache file.i   Ns   %s/.charmcacheR   RQ   s   %s lastsync=%s
s   mood_%s=%s
s
   %s pic=%s
s   %s journal=%s
s
   %s tag=%s
s   %s fg_%s=%s
s   %s ofg_%s=%s
s   %s
(   R   R   R   R   t   writeR   RW   R   R   R   R   R   R   R   (   R   R   t   user_home_dirR   t   cfileRZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   save_cache  s,    	
"%%c         C   s   y t  | d  } | d k r x t d | d  D]h } yN | d | } | |  j | d | <t  |  } | |  j k r | |  _ n  Wq3 t k
 r q3 Xq3 Wn  Wn t k
 r n Xd S(   s9   Given a dictionary containing network output, load moods.t
   mood_counti    i   s
   mood_%d_ids   mood_%d_nameN(   R   t   rangeR   R   R   (   R   t   net_dictt	   max_moodsRi   t   idstrt   idn(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   load_moods_from_net  s    c         C   s   g  |  _  yq t | d  } | d k ry xN t d | d  D]6 } y |  j  j | d |  Wq< t k
 rq q< Xq< Wn  Wn t k
 r n Xd S(   s<   Given a dictionary containing network output, load journals.t   access_counti    i   s	   access_%dN(   R   R   R   R   R   (   R   R   t
   max_journsRi   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   load_journals_from_net%  s    	c         C   s   g  } yw t  | d  } | d k rs xK t d | d  D]3 } y | j | d |  Wq9 t k
 rk q9 Xq9 Wn  | |  _ Wn t k
 r n Xd S(   s8   Given a dictionary containing network output, load tags.t	   tag_counti    i   s   tag_%d_nameN(   R   R   R   R   R   (   R   R   t   tagst   max_tagsRi   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   load_tags_from_net8  s    c         C   s   g  |  _  yq t | d  } | d k ry xN t d | d  D]6 } y |  j  j | d |  Wq< t k
 rq q< Xq< Wn  Wn t k
 r n Xd S(   sD   Given a dictionary containing network output, load picture keywords.t   pickw_counti    i   s   pickw_%dN(   R   R   R   R   R   (   R   R   t   max_pkRi   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   load_pickws_from_netI  s    	c         C   s1  i  |  _  i  |  _ i  |  _ g  |  _ y t | d  } | d k rx t d | d  D] } y | d | } t t d |   |  j  | <| |  j | <y t | d |  } Wn t k
 r d } n X| |  j | <| j	 d |  r |  j j
 |  n  WqW t k
 rqW XqW Wn  Wn t k
 r,n Xd	 S(
   sA   Given a dictionary containing network output, load friend groups.t   frgrp_maxnumi    i   s   frgrp_%d_namei   s   frgrp_%d_sortorderi2   s   frgrp_%d_publicN(   R   R   R   R   R   R   R_   t   powR   t   has_keyR   (   R   R   t
   max_frgrpsRi   t	   frgrpnamet   sortord(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   load_frgrps_from_netZ  s.    				
(   R   R   R   R   R   R   R   R   R   R   R  (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s   		-					t   Jabberc           B   s  e  Z d  Z d   Z d d  Z d   Z d   Z d d  Z d   Z	 d   Z
 d	   Z d
   Z d   Z d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d d  Z d d  Z d   Z d   Z g  d  Z d   Z d   Z g  d  Z i  d  Z d   Z d    Z d!   Z  d d"  Z! d d#  Z" d$   Z# d%   Z$ d&   Z% d'   Z& d(   Z' d)   Z( d*   Z) d+   Z* d,   Z+ d-   Z, d.   Z- d/   Z. d0   Z/ d1   Z0 d d2  Z1 d3   Z2 d4   Z3 d5   Z4 d6   Z5 d7   Z6 d8   Z7 d9   Z8 d:   Z9 d;   Z: d<   Z; d=   Z< d>   Z= d?   Z> d@   Z? dA   Z@ dB   ZA dC   ZB dD   ZC dE   ZD dF   ZE dG   ZF dH   ZG d d dI  ZH d dJ  ZI d dK  ZJ d dL  ZK dM   ZL d dN  ZM dO dP  ZN dQ   ZO dR   ZP dS   ZQ dT   ZR dU   ZS dV   ZT dW   ZU dX   ZV dY   ZW dZ   ZX d[   ZY d\   ZZ d]   Z[ d^   Z\ d_   Z] d`   Z^ d da  Z_ db   Z` dc   Za dd   Zb de   Zc df   Zd dg   Ze dh   Zf di   Zg dj   Zh d dk  Zi dl   Zj dm   Zk dn   Zl do   Zm dp   Zn dq   Zo dr   Zp ds   Zq dt   Zr du   Zs dv   Zt d dw  Zu dx   Zv dy   Zw dz   Zx d{   Zy d|   Zz d}   Z{ d~   Z| d   Z} d   Z~ d   Z d   Z d   Z d   Z d d  Z d   Z d d d d  Z d   Z d   Z d   Z d   Z d   Z d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s   The do-everything object.c         C   s  d |  _  i t d t d 6d d 6d d 6d d	 6d d
 6d d 6d d 6d d 6d d 6d d 6d d 6|  _ i  |  _ t j d k r d } n6 t j d& k r d } n t j d k r d } n d } | |  j d <t   } d | |  j d <d | |  j d <y t j d  |  j d! <WnJ t	 k
 rZy t j d" |  j d! <Wq[t	 k
 rVd# |  j d! <q[Xn Xt
   |  _ g  |  _ i  |  _ i  |  _ d$ |  _ i  |  _ d |  _ d |  _ d |  _ d% |  _ d$ |  _ g  |  _ i  |  _ i  |  _ i  |  _ i  |  _ i  |  _ i  |  _ d |  _ g  |  _ d% S('   s%   Set initial configuration parameters.i    t   /t   clientversions)   http://www.livejournal.com/interface/flatR+   Rg   R   t   monthR   R   Rm   R   R   R   t   getmoodst	   getpickwst   ljt   blogapit   posixt   unixt   ntt   dost   os2t   cet   pct   mact   lineendingss   %s/.ljdraftsR   s   %s/.ljarchiveR   t   VISUALR   t   EDITORt   viRQ   N(   s   ntR  s   os2R  (    t
   FastServerRN   RO   t   Paramst	   Save_MetaRp   t   nameR   R   R   R   t   Cachet	   NonRecurst   Loginst   Sitest   Sentt   Gott   LoggedInt   GottenFriendst
   GottenTagsR^   t   Bloggert   Moodt   Entriest   Entryt   GroupHeaderst   CommPicst   TagPicst   SocialUserst   Buddiest
   CheckDelayt   CheckGroups(   R   t   leR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s\    																								s   (none)c         C   s%   |  j  j |  r |  j  | S| Sd S(   s>   Return parameter with name pname, or dstr if it doesn't exist.N(   R  R  (   R   t   pnamet   dstr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   getval  s    c         C   s&   y |  j  | =Wn t k
 r! n Xd S(   s   Delete parameter, if it exists.N(   R  R   (   R   R5  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   del_param  s    c         C   s   Hd GHHd GHt  |  j  Hd GHx |  j j D] } | GHq, WHd GHt  |  j j  Hd GHx |  j j D] } | GHqd WHd GH|  j GHHd GHt  |  j  t GHHd S(	   s,   Print the debugging info we need most often.sN   --------------------------[ Dumping Debugging Info ]--------------------------s   Params:s	   Journals:s   Friends:s   Picture keywords:s   Sent:s   Got:N(	   RX   R  R   R   R   R   R$  R%  RM   (   R   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   dump_debug_info  s0    		c         C   sC   | d k r |  j } n  d | d | d | d | d | d f S(   s)   Return the current post time as a string.s   %s-%s-%s %s:%sR0   R1   R2   R3   R4   N(   R^   R  (   R   R[   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   format_time  s    c         C   s   t  j d |  |  j d <t  j d |  |  j d <t  j d |  |  j d <t  j d |  |  j d <t  j d	 |  |  j d
 <d S(   s)   Populate the time parameters with a time.s   %YR0   s   %mR1   s   %dR2   s   %HR3   s   %MR4   N(   t   timet   strftimeR  (   R   t	   timetuple(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   populate_time  s
    c         C   sA   x: t  D]2 } y |  j | |  j | <Wq t k
 r8 q Xq Wd S(   s?   Save off conf options we'll want to preserve across operations.N(   t   Conf_MetaDataR  R  R   (   R   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   save_conf_meta  s
    c         C   sE   x> | D]6 } y |  j  | | |  j | <Wq t k
 r< q Xq Wd S(   s-   Copy from network data, with a prefix string.N(   R%  R  R   (   R   t   pstrt   klistRZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   copy_net_data  s
    c         C   s  t  j | d d  } t |  d k rI | d | d f |  j | d <n t |  d k ry | d j d  \ } } | d } | j d d  \ } } | d	 k r | d
 | d f |  j | d <n | d
 | d f |  j | d <Wqd |  j | d <qXn d |  j | d <|  j | d d d k r| d k rnt j d | d | d f  d  |  j | d <q| d |  j | d <n) | d k rd GHn  | d |  j | d <d S(   s   Process Atom API login options.R   i   i   i   i    t   :R	  i   t   httpss   /%ss   www.blogger.coms   /atom/s   %s:%sisJ   Warning, Charm needs a cleartext password for WSSE non-SSL authentication.N(   s   www.blogger.coms   /atom/i   (   s   www.blogger.coms   /atom/i   (   R{   R   Rz   R#  t   base64t   encodestringR"  (   R   t   pvalt	   is_hashedR   t   protot   rstrt   sitet   baseuri(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_login_config%  s*    "
!"3c         C   s  | d k r n| d3 k r# d GHn| d4 k rK t  j j |  |  j | <n| d k r | d5 k rs | |  j | <qd | GHnx| d k r	t j | d d  } yM t | d  |  j | d <t |  d k r d | d |  j	 | d <n  Wqt
 k
 rd GHqXn| d k rt j | d d  } yG | d |  j | d <t |  d k rpd | d |  j	 | d <n  Wqt
 k
 rd GHqXnj| d k s| d k rt d k ry3 | d k r|  j | d  n |  j | d  Wq	t
 k
 r d | GHq	Xqd GHn| d k rzt j | d d  } t |  d k rGd GHq| d |  j | d <| d d f |  j	 | d <n}| d k rt j | d d  } y | d |  j | d <Wqt
 k
 rd GHqXn'| d  k r&t j | d d  } y | d |  j | d <Wqt
 k
 r"d! GHqXn| d" k r|t j | d d  } y | d |  j | d <Wqt
 k
 rxd# GHqXn{| d$ k rt j | d d  } y | d |  j | d <Wqt
 k
 rd% GHqXn%| d& k r| d' k r| |  j d& <qn | d( k r"t j |  |  j d) <n | d* k rRt d+   t j | d   |  _ n | d, k ry1 t |  d- } | d k rd. GHn	 | |  _ Wqt k
 rd/ GHqXnL | d0 k rt j | j    r| j   |  j d0 <qd1 GHn | |  j | <d2 S(6   s2   Set a special option that requires pre-processing.R   R   R   s  The options user, password, and hpassword are deprecated. Please use
one of the following:
    login = username password
    hlogin = username MD5hexpassword
    atomblog = username password
    hatomblog = username base64password
in your .charmrc file instead.R   R   R   t   noneR0   R  s$   Warning: invalid value for option %sR   R   i   i   i    i   s   http://%s/interface/flats*   Warning: malformed value for login option.R   s+   Warning: malformed value for hlogin option.R    R!   s'   Warning: malformed value for %s option.s*   Warning: no support for Atom API blogging.R"   s,   Warning: malformed value for metaweb option.s   IGNORE-APPKEYR%   t   ,s/   Warning: malformed value for socialuser option.R&   s0   Warning: malformed value for groupheader option.R'   s,   Warning: malformed value for commpic option.R(   s+   Warning: malformed value for tagpic option.R)   RQ   R*   R8   R,   c         S   s   t  j |   S(   N(   R{   t   lower(   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s    R-   i<   s3   Warning: bad value for checkdelay option, ignoring.s/   Warning: malformed value for checkdelay option.R$   s1   Warning: invalid social bookmarks service option.N(   R   R   (   s	   draft_dirs   archive_dir(   RO  s   years   month(   Rp   Rq   t
   expanduserR  R{   R   R   R"  Rz   R#  t
   IndexErrort   atom_okRN  R0  R-  R.  R/  RQ  R   R3  R   R2  R   t   Social_BookmarksR  (   R   R5  RH  R   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_special_optE  s      	s   .charmrcc   	      C   s  | |  j  k r d | GHd S|  j  j |  y t | d  } Wn[ t k
 r |  j  | g k r d | t   f GHt j d  q d | t   f GHd Sn X| j   } x| d k rt j	 |  } | d k r n| d d	 k r n| d
  d k r|  j
 t j j | d
   nht j | d d  } t |  d k  rLd | GHn5t j t j | d   } t j | d  } y t | } t |  } | d k rd | GHno t | d k r| d k rd } qd } n  | d k rt |  |  j | <n |  j j |  r|  j | =n  Wnb t k
 ry4 t | d k rO| |  j | <n |  j | |  Wqt k
 r|d | GHqXn X| j   } q W| j   d S(   s7   Read in config info from an rc file of key=value pairs.s/   Attempt to recursively read rcfile %s, skipped.NR   s(   Unable to open rcfile '%s': %s. Exiting.i   s(   Unable to open rcfile '%s': %s. Skipped.RQ   i    t   #i   s   include R   i   s   Warning: invalid line, %sis,   Warning: invalid value for boolean option %ss   Warning: invalid option name %s(   R!  R   R   R   Ra   R\   t   exitR   R{   R   t   read_rcfileRp   Rq   RR  R   Rz   RQ  t   stript   Bool_MapRo   t	   Bool_OptsR_   R  R  R   t
   Other_OptsRV  R   (	   R   t   rcfileRk   R   R   R5  RH  t   prealt   pnum(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyRY    s`    	 
		c         C   s   d } yg |  j  j d  rl t j j d  rl t j j d  rl t j t j j t j j	 d  d   } n  Wn n X| d k r | |  j  d <d |  j  d <| Sd Sd S(   sE   Set and return the title of auto-detected music, if we can manage it.RQ   R   i    R>   i   s   (none)N(
   R  R  t   xmmst   controlt
   is_runningt
   is_playingR{   RZ  t   get_playlist_titlet   get_playlist_pos(   R   t   music(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   autodetect_music
  s    61c         C   s>   t  d   |  j j j    } | j   t  d   |  } | S(   s;   Return friend group list in sorted order, by sort priority.c         S   s   |  d |  d f S(   Ni   i    (    (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR   $  s    c         S   s   |  d S(   Ni   (    (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR   &  s    (   R   R   R   R   t   sort(   R   R   t   olist(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   sort_friendgroups  s    
c         C   sM   |  j  d } t | d  } | d k r, d Sd | | f } | |  j  d <d S(   s   Set up for a draft file.R   t   draftsi    s   %s/draft_%st
   draft_filei   (   R  Rx   (   R   t   timestrt   ddirt   okt   dfile(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   make_draft_file*  s    c         C   sg   x0 t  D]( } y |  j | =Wq t k
 r. q Xq Wd |  _ y d |  j _ |  j j d =Wn n Xd S(   s   Clear out metadata.RQ   t   editN(   t   Basic_MetaDataR  R   R*  R)  R   R   (   R   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   clear_metadata?  s    	c         C   sK   |  j    x: t D]2 } y |  j | |  j | <Wq t k
 rB q Xq Wd S(   s   Restore metadata to defaults.N(   Ru  R?  R  R  R   (   R   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   reset_metadataO  s    
c         C   s   y' d t  j j |  j d  | f } Wn( t k
 rQ d |  j d | f } n Xyd t | d  } xD t D]< } y" | j d | |  j | f  Wqk t k
 r qk Xqk W| j   Wn t	 k
 r n Xd S(   s   Save metadata.s   %s/.meta_%sRm  R   R   s   %s=%s
N(
   Rp   Rq   t   dirnameR  R   R   Rt  R   R   R   (   R   Rn  t   mfnamet   mfileRZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   save_metadataZ  s    $"i    c         C   sA  y)|  j  d } | d k r(t j j |  } t j j |  } t j t j | d  d d  } | d k rt d  } Ht j	 t j
 |   } | d k r d	 | | f } y t j |  Wn t k
 r n Xt j |  d
 Sd t j d G| |  j  d k r| GHq| GHn  |  j |  Hn  Wn t k
 r<n Xd
 S(   s   Save a session.Rm  RQ   t   _ii   s/   Do you want to save the current session (Y/N)? Ri   Rh   s   %s/.meta_%sNs6   Saving current session. You can resume it with:
	%s -ri    R   (   Ri   s   no(   R  Rp   Rq   t   basenameRw  R{   R   R   RV   RQ  RZ  t   unlinkRt   R\   t   argvRz  R   (   R   t   noisyRq  t   dbaseRo  Rn  RU   Rx  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   save_sessionr  s4    "RQ   c         C   s   | d k r |  j  d } n  t j j |  } t j j |  } t j t j | d  d d  } d | | f } y t j |  Wn t	 k
 r n Xt j |  |  j
   x9 d d d g D]( } y |  j  | =Wq t k
 r q Xq Wd S(	   s)   Delete old files and clear out meta-data.RQ   Rm  R{  is   %s/.meta_%sR5   t   itemidN(   R  Rp   Rq   R|  Rw  R{   R   R   R}  Rt   Rv  R   (   R   Rq  R  Ro  Rn  Rx  RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   clear_session  s"    "
c         C   s[   g  } | j    } x) | d k r= | j |  | j    } q Wt j | d  |  j d <d S(   s%   Read a file into the event parameter.RQ   R5   N(   R   R   R{   R   R  (   R   Rk   t   bodyR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   read_event  s    c         C   s   y |  j  d } Wn t k
 r. d | GHd SXt j | t j t j B d k r^ d | GHd St j |  t j d k r d | GHd Sy t | d  } Wn$ t	 k
 r d | t
   f GHd SX|  j |  | j   d S(	   s+   Read a draft file into the event parameter.Rm  s'   %s attempt cancelled: No current draft.i    s9   %s attempt cancelled: Cannot read the current draft file.s*   %s attempt cancelled: Draft file is empty.R   s3   %s attempt cancelled, error reading draft file: %s.i   (   R  R   Rp   t   accesst   F_OKt   R_OKt   statt   ST_SIZER   R   Ra   R  R   (   R   t   optypeRq  Rk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   slurp_draft  s&    	"		
c         C   s   i | d 6t  t |   d 6} xS | D]K } y1 |  j | d k r] t  |  j |  | | <n  Wq' t k
 rq q' Xq' WxG | D]? } y t  |  j |  | | <Wq} t k
 r d | | <q} Xq} W| r t |  } n t j |  } | S(   s.   Encode a list of parameters into a URL string.t   modet   verRQ   (   R   R_   R  R   R   R   t	   urlencode(   R   R  t   has_utfRB  t   blistt   pdictRZ   R`   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   web_encode  s      c         C   s   yh |  j  d } | d k rg y" |  j d | |  j  d f  Wn" t k
 rb |  j d |  n Xd SWn# t k
 r |  j d |  d SXd S(	   s#   Parse server-returned success code.t   successt   FAILs   %s failed: %sRa   s&   %s failed, no error message specified.i    s)   %s failed, server error. Try again later.i   (   R%  t   showR   (   R   R  t	   succ_code(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   parse_return  s    "c         C   s   t    } |  j d k r+ | j d d  n  | t _ y  t j |  j d |  j  } Wn d t   GHi  |  _	 d SXi  |  _	 d } | j
   } xN | d k r | d  } | d k r | } n | |  j	 | <d } | j
   } q Wd S(	   s.   Client operation: Send request, read response.i   t   Cookies   ljfastserver=1R+   s&   
Network error (%s). Try again later.
NRQ   i(   R   R  t	   addheaderR   t
   _urlopenert   urlopenR  R$  Ra   R%  R   (   R   t   tmpt   netobjR_   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   raw_client_op  s(    		 		
	c         C   s:  y t  d  } d } Wn d } n X|  j d | d g  |  _ |  j   |  j d  } | d k r |  j d  |  j d  |  j d	  |  j | | | d d
 g |  |  _ nw d |  j d <|  j d |  j d <t d |  j d |  j d
 f  |  j d	 <|  j | | | d d d d	 g |  |  _ |  j   d S(   s   Client operation: Obtain a challenge string, if possible. Use
           this to authenticate the full operation, sending data and
           reading the response.t   ai   i    t   getchallengeR   s   Challenge authenticationt   auth_methodt   auth_challenget   auth_responseR   t	   challenges   %s%sN(	   R   R  R$  R  R  R8  R  R%  R   (   R   R  RB  R  R  R  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   client_op0  s,    


+	c         C   s  y d d l  } Wn, t k
 r> d |  j d <d |  j d <d SX|  j d j d  } d	 d j | d   } | j |  } i  } y\ | j j j	   |  _ d
 | d <|  j d
 | d <t
 d |  j d
 |  j d f  | d <Wn |  j d | d <n X|  j d | d <d | d <x$ | j   D] \ } }	 |	 | | <q Wyw | d k rd| j j j |  |  _ n? | d k r| j j j |  |  _ n | j j j |  |  _ d |  j d <WnG | j k
 r}
 |
 j |  j d <d |  j d <n d GHi  |  _ n Xd S(   s   XML-RPC transaction.iNR  R  s=   Your Python installation lacks the required xmlrpclib module.Ra   R+   R	  s	   %s/xmlrpcR  R  R  s   %s%sR   R  R   R   Rg   R  t   editfriendst
   getfriendst   OKs!   
Network error. Try again later.
(   t	   xmlrpclibt   ImportErrorR%  R  R   R   t   ServerProxyt   LJt   XMLRPCR  R   R   R  R  t   consolecommandt   Errort   faultString(   R   t   metht	   send_dictR  t   raw_url_elemsR+   t   serverR   RZ   R   t   faultobj(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   cli_xmlrpcS  sD    
,
c   
      C   s   d } t  j | d  } x | D] } d } t  j t |  d  } x | D] } t |  } t |  }	 | |	 d k r | d k r | | } n | GH| } |	 } qJ | d k r d | | f } | |	 d } qJ | | } |	 } qJ W| GHd } q Wd S(	   s0   Show a word-wrapped message in an output window.RQ   s   
i    R   iK   s   %s %si   N(   R{   R   R_   Rz   (
   R   t   msgR   t   linest   textt   cur_lenR   R   t	   this_wordt   this_len(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s*    	

c         C   s    |  j  j |  j  d |  _ d S(   s   Process returned user tags.i   N(   R   R   R%  R(  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   process_getusertags  s    c         C   s    |  j  j |  j  d |  _ d S(   s   Process returned friend groups.i   N(   R   R  R%  R'  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   process_getfriendgroups  s    c         C   s   |  j  d d d g  |  j d  } | d k r5 d Sy |  j d |  j d <Wn t k
 r` n X| d k r y$ |  j d d k r d	 GHn d
 GHWq t k
 r d GHq Xn  d S(   s   Client request: checkfriendst   checkfriendst
   lastupdatet   masks   Friends checki    NR   Rg   s   You have new friend updates.s   No new friend updates.s   Server error. Try again later.(   R  R  R%  R  R   (   R   t   silentRp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_checkfriends  s    	c         C   sM  |  j  j d k r. t |  j  j  |  j d <n  |  j d d d d g  |  j d  } | d k rf d S| d k r |  j d |  j d	  y |  j d
 } H|  j |  Wq t k
 r q Xn  y) |  j d } | d k r d |  _	 n  Wn t k
 r n X|  j  j
 |  j  |  j   |  j  j |  j  |  j  j |  j  d |  _ d S(   s   Client request: logini    R  R   R
  R  t   LoginNs   Welcome, %sR  t   messaget
   fastserveri   (   R   R   R_   R  R  R  R  R%  R   R  R   R  R   R   R&  (   R   t   no_show_infoRp  R  t   fs_code(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   cli_login  s2    
c         C   s    |  j  d d g  |  j d  S(   s   Client request: getdaycountst   getdaycountsR8   t	   Retrieval(   R  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getdaycounts   s    c         C   s'   |  j  d d d g t  |  j d  S(   s   Client request: posteventt	   posteventR  R5   t   Post(   R  Rt  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_postevent  s    c         C   s  d |  j  d <d |  j  d <d |  j  d <d GHH|  j d d d d d d	 d
 g |  x( d d d d	 g | D] } |  j  | =qj W|  j d  } | d k r d Sy t |  j d  } Wn t k
 r d GHd SX| d k  r d GHd Sg  |  _ y xy t d | d  D]d } i  } |  j d | | d <|  j d | | d <t j	 |  j d |  | d <|  j j
 |  qWWn t k
 rd | GHn Xd S(   s+   Client request: getevents (download a list)t   55t   truncateRg   t   prefersubjectt   nopropss   Retrieving...t	   geteventsR  t
   selecttypeR8   R  i    t   events_counts   No entries returned.i   s   events_%d_itemidR  s   events_%s_eventtimeR;  s   events_%d_eventR7   s*   Error while processing retrieved entry %d.(   R  R  R  R   R%  R   R+  R   R   t   unquote_plusR   (   R   t   tmp_keysRZ   Rp  t   ecountRi   t   ljo(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getevents_list  sB    		c         C   s   |  j  |  y |  j d } xl |  j j j   D]X } |  j j | | k r0 |  j j d  r{ d | |  j d f |  _ n	 | |  _ Pq0 q0 WWn/ y |  j d |  _ Wq t k
 r q Xn Xd S(   s   Copy common event data.R<   R;   s   %s (%s)N(   R>  R  R   R   RW   R  R*  R   (   R   R=  t   mRZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   event_common_dataA  s    	c         C   s  d GHHd |  j  d <|  j d |  j  d <|  j d d d d d g  |  j  d =|  j  d =|  j d  } | d	 k rv d	 Sy+ |  j d
 d k r d |  j d
 GHd	 SWn t k
 r d GHd	 SXy |  j d |  j  d <Wn t k
 r d GHd	 SXy t j |  j d d  } Wn\ t k
 rhy t j |  j d d  } Wqit k
 rdd GHt j	 t j    } qiXn X|  j
 d d d d g  y |  j d } yU t |  } xB t d | d  D]- } |  j d | |  j  d |  j d | <qWWn t k
 rd GHn XWn t k
 rn X|  j |  t j d |  } |  j |  } | d	 k rSd	 SyA t |  j  d d   } | j t j |  j d!   | j   Wn t k
 rd" t   GHn X|  j |  d S(#   s'   Retrieve all data about a single event.s   Retrieving entry...t   oneR  R  R  R  R8   R  i    R  Rg   s0   Error. Server returned incorrect entry count: %ss,   Error. Server did not return an entry count.t   events_1_itemids.   Error. Server did not return item ID of entry.t   events_1_eventtimes   %Y-%m-%d %H:%M:%Ss   %Y-%m-%d %H:%Ms9   Server returned malformed entry time. Setting to present.t	   events_1_R)   R:   R7   t
   prop_counti   s   prop_%d_valuet   prop_s   prop_%d_names3   Server returned malformed property count. Ignoring.s   %Y%m%d_%H%M%SRm  R   t   events_1_events   Error writing to draft file: %s(   R  R,  R  R  R%  R   R;  t   strptimeR   t	   localtimeRC  R   R   R  R<  Rr  R   R   R   R  R   R   Ra   Rz  (   R   Rp  R=  t   pcstrt   pcountRi   Rn  Rk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getevents_oneY  st    

/c         C   s   t  j d |  |  j d <t  j d |  |  j d <t  j d |  |  j d <d |  j d <|  j d d d d d	 d d
 g  |  j d =|  j d  } | d k r t  n  d S(   s/   Retrieve all data about events on a single day.s   %YR0   s   %mR  s   %dR2   R  R  R  R8   R  i    N(   R;  R<  R  R  R  R   (   R   t   ttupRp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getevents_day  s    
c         C   s   |  j  j d  rm t j t j |  j  d d   } t j d t j | d   |  j  d <d |  j  d GHn d GHd |  j  d <|  j d d	 d
 d d g  |  j d  S(   s-   Retrieve events as part of a synchronization.R   s   %Y-%m-%d %H:%M:%Si   s     Retrieving posts after %s...s     Retrieving all posts...t	   syncitemsR  R  R  R8   s   Synchronization download(	   R  R  R;  t   mktimeR  R<  R  R  R  (   R   t	   last_secs(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getevents_sync  s    &c         C   s*   |  j  d d d d g t  |  j d  S(   s   Client request: editeventt	   editeventR  R  R5   t   Edit(   R  Rt  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_editevent  s    c         C   s&   |  j  d d g d g  |  j d  S(   s"   Client request: editevent (delete)R  R  R5   t   Deletion(   R  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_delevent  s    c         C   s    |  j  d d g  |  j d  S(   s   Client request: syncitemsR  R   t   Synchronization(   R  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_syncitems  s    c         C   sY   |  j  d g   |  j d  } | d k rK |  j j g  k rG Hd GHHn  d S|  j   d S(   s   Client request: getusertagst   getusertagss   Tag retrievali    s    Warning: Using cached tags data.i   (   R  R  R   R   R  (   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getusertags  s    
c         C   s^   |  j  d g   |  j d  } | d k rP |  j j i  k rL Hd GHd GHHn  d S|  j   d S(   s   Client request: getfriendgroupst   getfriendgroupss   Friend group retrievali    sK   Warning: Using cached friend groups data. If you have recently updated yours+   list of groups, double-check these results!i   (   R  R  R   R   R  (   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getfriendgroups  s    
c         C   sh   d GHH|  j  d  |  j d  } | d k r2 d Si  |  _ x& |  j d D] } | |  j | d <qI Wd S(   s   Client request: getfriendss   Getting friends...R  s   Friend retrievali    t   friendsR   i   (   R  R  R1  R%  (   R   Rp  t   friend(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_getfriends  s    	c   	      C   s  d GHH|  j  d i | d 6 |  j d  } | d k r< d St GH|  j d } x t t |   D] } | | } d d j | |  d | d f GHHd } xq | d D]e \ } } | | k r | GHn? | d k r Hn  | d k r Hd GHn | d k rHd GHn  | GH| } q Wt GHqa Wd S(   s"   Send and process console commands.s   Processing commands...R  t   commandst   Commandsi    t   resultss   Command: %s (%s)R   t   FAILEDt   executedR  RQ   t   outputt   infot   errors   INFO:s   ERROR:N(   R  R  (   s   infos   error(   R  R  RM   R%  R   Rz   R   (	   R   t   cmdsRp  t   rvalsRi   R   t
   last_ttypet   ttypeR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_consolecmd  s6    
$
c   	      C   s   i | d 6} | d k r& | | d <n  | d k r? | | d <n  | d k rX | | d <n  |  j  d i | g d 6 |  j d	  } | d k r d Sx3 |  j d
 D]$ } d d | | d | d f GHq Wd S(   s   Add or edit a friend.R   i    t	   groupmaskRQ   t   fgcolort   bgcolorR  t   addt	   Friendingt   addeds   %s: %s (%s).t   Friendedt   Editedt   fullnameN(   R  R  (   R  R  R%  (	   R   R   t   gmaskt   fgcolt   bgcolt   is_editR   Rp  R[   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_addfriend<  s    
c         C   sB   |  j  d i | g d 6 |  j d  } | d k r9 d Sd GHd S(   s   Delete a friend.R  t   deletes   Friend deletioni    s   Un-friending successful.N(   R  R  (   R   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_delfriendQ  s
    c         C   sh   | |  j  d | <t |  |  j  d | <t |  |  j  d | <|  j d d | d | d | g  d S(   s   Add or edit a friend group.s   efg_set_%d_names   efg_set_%d_sorts   efg_set_%d_publict   editfriendgroupsN(   R  R_   R  (   R   t   gnamet   gnumt   gsortt   gpub(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_mod_friendgroups\  s    c         C   s>   |  j  | | | |  |  j d  } | d k r5 d Sd GHd S(   s   Send a new friend group.s   Friend group creationi    Ns   Group created.(   R!  R  (   R   R  R  R  R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_addfriendgrouph  s
    c         C   s>   |  j  | | | |  |  j d  } | d k r5 d Sd GHd S(   s   Alter a friend group.s   Friend group editingi    Ns   Group edited.(   R!  R  (   R   R  R  R  R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_editfriendgroups  s
    c         C   sP   d |  j  d | <|  j d d | g  |  j d  } | d k rG d Sd GHd S(   s   Delete a friend group.Rg   s   efg_delete_%dR  s   Friend group deletioni    Ns   Group deleted.(   R  R  R  (   R   R  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   cli_delfriendgroup~  s    c         C   s  |  j  j d  s! |  j g  k r% d S|  j d k rA |  j   n  |  j j i  k rW d Sd } i  } x= |  j j j   D]) } t |  j j |  | t	 j
 |  <qv WxF |  j D]; } x2 | j   D]$ } | | k r | | | B} Pq q Wq W| d k rt |  |  j  d <n  d S(   sB   Process friend group information prior to checkfriends invocation.R  Ni    (   R  R  R3  R'  R  R   R   RW   R   R{   RQ  R_   (   R   R  t   fdictRZ   t   g(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   prepare_checkfriends  s"    !'c         C   sD   |  j  d  y |  j d d k r+ d GHn  Wn t k
 r? n Xd S(   s'   Event called by checkfriends scheduler.i   R   Rg   s8   
        >> You have new LiveJournal friend updates. <<
N(   R  R%  R   (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   checkfriends_event  s    c         C   s   x |  j    y t |  j d  } Wn- t k
 r= d } n t k
 rS d } n X| |  j k rs t j |  q t j |  j  q d S(   s3   Run in the background, checking for friend updates.t   intervali    N(   R(  R   R%  R   R   R2  R;  t   sleep(   R   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   checkfriends_loop  s    
	
c   
      C   sE  y3 |  j  d } t j t j | d  d d  } Wnt k
 rt j t j    } t j d |  } |  j |  } | d k r d S|  j  d } |  j  j	 d  rySd } |  j  d	 d
 k rz|  j  d d k r d } qt
 |  j  d  } g  } xk |  j   D]] } | t
 |  j j |  @r|  j j	 |  rO| j |  j |  qc| j d |  qqWd t |  } n |  j  d	 d k rd } n  | d k rt | d  }	 |	 j |  |  j  j	 d  r|	 j d  n  |	 j d  |	 j   n  Wqt k
 rqXqn X|  j |  t j d |  j  d | f  d S(   s   Edit a post.Rm  R{  is   %Y%m%d_%H%M%Si    NR   RQ   R)   t   usemaskR:   Rg   s   [ To my friends. ]
s   the %ss   [ To %s. ]
t   privates   [ Private only. ]
R   R   s   <P>
s   
s   %s "%s"R   (   R  R{   R   R   R   R;  R  R<  Rr  R  R   Rk  R   R   R-  R   R   R   R   R   Rz  Rp   t   system(
   R   Rq  Rn  R=  Rp  t   hdr_strt   mnumRj  RZ   t   fh(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   edit_post  sJ    &		c         C   s|   y |  j  d } Wn d } n XyH t j d | |  j  d f  y t j d |  j  d  Wn n XWn d GHn Xd S(   s    Invoke a spellchecker on a post.R   s   /usr/bin/aspell -cs   %s "%s"Rm  s   %s.baks   Could not invoke spellchecker.N(   R  Rp   R.  R}  (   R   t   spath(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   do_spellcheck  s    
c         C   se  | rK y+ t  j d |  j d |  j d  d GHWn d t   GHn Xd Sd GH|  j j d  r| t d |  j d  } n t d	  } H| d
 k r |  j j d  r |  j d } q d GHHd Sn  |  j d  s d S|  j j d  sS|  j d |  j d <y t d |  j d d  } Wn d t   GHd SX| j |  j d  | j	   n  y t  j
 |  \ } } Wn d t   GHd SXyu | j |  j d  | j	   |  j |  | j	   |  j j d  s|  j d d
 k rd | GHd Sd | GHWn d | t   f GHd SXy= t |  j d d  } | j |  j d  | j	   d GHWn d GHn Xd S(   s   Pass post through a filter.s   %s.rawRm  s   Reverted to pre-filtered post.s   Reversion failed (%s).Ns   
Please specify the path to a filter command. Your draft will be sent to it
on stdin. The filter must return its output on stdout.
R.   s   Filter to use [default: %s]: s   Filter to use: RQ   s   No filter chosen.t   FilterR6   R5   R   s   Error reading draft file (%s).s   Error invoking filter (%s).s0   Filter (%s) failed: returned empty message body.s   Applied filter: %ss   Filter (%s) failed: %ss   Filtered draft saved.s!   Error saving filtered draft (%s).(   Rp   t   renameR  Ra   R  RV   R  R   R   R   t   popen2R  (   R   t
   is_reverseRU   t   fbt   f_int   f_outR[   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   filter_post  sj    "	

&	
	c         C   s   t  d  } H| S(   s   Get menu choice.s    Enter choice, and press return: (   RV   (   R   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   get_choice_  s    c         C   s;   |  j  d  |  j j |  j d  d GHHt j d  d S(   s   Quit gracefully.i   R   s   Thank you for using Charm.i    N(   R  R   R   R  R\   RX  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   do_quitg  s
    c         C   sP   d GHt  d  } Ht j t j |   } | d k rC |  j   n	 d | GHd S(   s&   Handle a keyboard interrupt exception.s)   

Received Ctrl-C or other break signal.
s   Do you want to quit (Y/N)? Rc   Rb   s   Returning to %s menu.
N(   Rc   s   yes(   RV   R{   RQ  RZ  R>  (   R   t   menu_strRU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   handle_interruptq  s    c         C   s  d t  j d | | d d d d d d d f	  GHH|  j   } | d k re Hd GHHt j | |  Hd Sd t   } t j | |  } t |  } d } d } d	 }	 d
 }
 d GHd } x? t d  D]1 } | d | d k r | | } q | |	 } q W| d GHx t d  D] } | d | d k r,|
 Gqy? d | d | } d | d | d |  j	 | | d f GWqt
 k
 rd | d | GqXqWd GH| GHx t d | d  D] } xw t d  D]i } y? d | | | } d | | | d |  j	 | | d f GWqt
 k
 r,d | | | GqXqWd GH| GHqWx t d  D]} } | d | d k rjPqLy; d | d | d |  j	 | t | d |  d f GWqLt
 k
 rd | d | GqLXqLWd GHd } x6 t d  D]( } | d | d k rPq| |	 } qW| d GHHd S(   s   Show calendar with post counts.s    Retrieving post counts for %s...s   %B %Yi    s   Displaying ordinary calendar.Ns   %(year)d-%(month)02d-sG   +---------+---------+---------+---------+---------+---------+---------+s
             s
   +---------s	            sE     Sunday    Monday    Tuesday  Wednesday  Thursday  Friday   SaturdayRQ   i   R   s   %02ds
   | %2d %-4st   (t   )s
   | %2d     t   |i   i(   R;  R<  R  t   calendart   prmontht   varst   monthcalendarRz   R   R%  R   R_   (   R   R0   R  Rp  t   bstrt   mmatrixt   weekst
   whole_linet
   space_unitt   bar_unitt
   blank_unitR   R[   R6  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   show_calendar~  s~    -		-	c         C   s]   xV |  j  j D]H } | t j |  k r | d k rD |  j d  n | |  j d <Pq q Wd S(   s!   Set a picture keyword, if we can.t   defaultR=   N(   R   R   R{   RQ  R8  R  (   R   R5  RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   set_pickw  s    c         C   s   t  j t  j |   } | |  _ |  j d  |  j d  | d k rK d Sy! |  j j | } | |  j d <Wn t k
 r | |  j d <n X|  j	 |  d S(   s   Set a mood, given text.R;   R<   RQ   N(
   R{   RQ  RZ  R*  R8  R   R   R  R   RQ  (   R   t	   mood_textt   mood_id(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_mood  s    	c         C   s  | d k r) d |  j  d <|  j d  nY| d k rR d |  j  d <d |  j  d <n0| d k r{ d |  j  d <|  j d  n|  j d k r |  j   n  |  j j i  k r|d } g  } t j t j |  d	  } x! | D] } | j	 | j
    q WxL |  j j j   D]8 } t j |  | k r| t |  j j |  O} qqW| d k rXt  n  d |  j  d <t |  |  j  d <d
 St  d
 S(   s    Set security level to something.t   publicR)   R:   R  R,  Rg   R-  i    RP  N(   R  R8  R'  R  R   R   R{   R   RQ  R   RZ  RW   R   R   R_   (   R   RH  R  t   flistt   vlistR   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_security	  s4    !	c         C   s  |  j  j d  r0 | j d |  j   d  n6 t j t j    } | j d t j d |  d  |  j  j d  r | j d |  j  d d  |  j  j d  r | j d |  j  d d  q n  |  j  j d	  r | j d
 |  j  d	 d  n  |  j  d d k r@|  j  j d  r| j d |  j  d d  qnb |  j  j d  rq| j d |  j  d d  n  |  j  j d  r| j d |  j  d d  n  |  j d k r| j d |  j d  n  |  j  j d  r| j d |  j  d d  n  |  j  j d  r.| j d |  j  d d  n  y |  j  d d k r|  j  d d k rg| j d  q| j d  t |  j  d  } g  } x> |  j	   D]0 } | t |  j
 j |  @r| j |  qqW| j d t |  d  n | j d |  j  d d  Wn t k
 rn Xg  } x4 d( D], } |  j  j d# |  r*| j |  q*q*W| g  k r| j d$ t j |  d  n  |  j  j d%  r| j d& |  j  d% d  n  d' S()   s)   Write out post meta-data to a filehandle.R0   s   Date:      s   
s   %Y-%m-%d %H:%MR8   s   Journal:   R9   s   Poster:    R7   s   Subject:   R  R  R@   s   Tags:      s   Category:  RA   RQ   s   Mood:      R=   s   Picture:   R>   s   Music:     R)   R,  R:   Rg   s   Security:  friends
s   Security:  custom
s   Friends:   s   Security:  t   preformattedt	   backdatedt
   nocommentsR   s   prop_opt_%ss   Options:   R  s   ItemID:    N(   RY  RZ  R[  R   (   R  R  R   R:  R;  R  R<  R*  R   Rk  R   R   R   R   R   R{   R   (   R   Rk   R=  R0  Rj  RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   write_metadata)	  s\    "" !c         C   s   |  j  |  y y t |  j d d  } Wn t k
 rJ d t   GHd SX| j d  | j   } x) | d k r | j |  | j   } qg W| j   Wn n Xd S(   s!   Write out a post to a filehandle.Rm  R   s   Error reading draft file: %sNs   
RQ   (   R\  R   R  R   Ra   R   R   R   (   R   Rk   R[   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   write_posti	  s    c         C   s'  t  GHHy |  j d } Wn< t k
 rU y t j d } WqV t k
 rQ d } qV Xn X| d k rk d } n  t j | t j t j B d k s t j d k r t	 j
 } d } nH t	 j d k r d d	 l } | j | d
  } n t j | d
  } d } |  j |  | d k r| j   n  Ht  GHHd	 S(   s2   Display a post, using a pager if one is available.R   t   PAGERRQ   s   /usr/bin/morei    R  t   win32iNR   i   (   RM   R  R   Rp   R   R  R  t   X_OKR  R\   t   stdoutt   platformt	   win32pipet   popenR]  R   (   R   t   ppathRk   t   is_pipeRc  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   display_post~	  s2    		1		c         C   sz   Ht  d  } Ht j j |  } y t | d  } Wn$ t k
 rY d | t   f GHd SX|  j |  | j   d GHd S(   s   Save post to a file.s   File name to save under: R   s   Error writing to file '%s': %sNs   Saved.(	   RV   Rp   Rq   RR  R   R   Ra   R]  R   (   R   RU   t   afileRk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   save_post_file	  s    
c   
      C   s  |  j  d } t | d  } | d k r, d S|  j  d d k r |  j  j d  ri | d |  j  d } n | d |  j  d	 } t | d
  } | d k r | } q n  |  j  d d k r | d |  j  d } t | d  } | d k r | } q n  |  j  d d k rC| d |  j  d } t | d  } | d k rC| } qCn  |  j  d d k rq|  j  d |  j  d } n) |  j  d d k r|  j  d } n d } d | | |  j  d |  j  d |  j  d f } | d k r|  j  d d k rt j t j    } | d t j d |  } n  y t | d  }	 Wn t k
 rLd t   GHd SX| d k ri|  j	 |	  n4 |  j
 |	  |	 j d  |	 j |  |	 j d  |	 j   | S(   s   Archive current post.R   R   i    RQ   R   Rg   R8   R	  R   s   archive journal subdirectoryR   R0   R  s   archive yearR1   s   archive monthRO  s   %s/%s%s_%s%sR2   R3   R4   i   R   t   _eds
   %Y%m%d%H%MR   s!   Error writing to archive file: %ss   
(   s   years   month(   R  Rx   R  R;  R  R<  R   R   Ra   R]  R\  R   R   (
   R   R  t   text_to_outputt   adirRp  R  t   afdateRh  R=  Rk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   make_archive	  sX    
c         C   sR  |  j  d  } | d k r d S|  j d d k r; d GHd S|  j j d  d k rx t j t j    } |  j |  n  | d k r |  j j d k r t j j	   j
   |  j _ n  |  j   | d k r |  j j   } n |  j   } | d k r d Sd GH|  j d	 d
  d k r?|  j d  } | d k r?d | GHq?n  |  j   d GHd S(   s   Send a post to the server.R  i    R5   RQ   s   Nothing to post.R0   i   s   Post successful.R   Rm   Rg   s   Archived post: %ss%   Draft cleared. Beginning new session.(   R  R  R  R;  R  R>  R)  R   t   datetimet   utcnowt	   isoformatR  t   blog_posteventR  R7  Rn  R  (   R   t   is_blogRp  R=  Rh  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   go_post
  s2    

c         C   s  |  j    |  j d  } | d k r) d S|  j j d  rd|  j d d k rdt j t j    } | d t |  j d  k r | d t |  j d  k r | d t |  j d	  k r t j d
 |  } q t j d |  } n t j d |  } |  j j d  rC|  j d d k rCt |  j d d | d  |  j d <qdd |  j d | f |  j d <n  d GHH| d k r|  j	 j
   } n |  j   } | d k rd Sd GH|  j d d  d k r|  j d  d GHn  |  j   g  |  _ i  |  _ d GHd S(   s   Post an edited entry.R  i    R   Rg   R0   i   R1   i   R2   s   [ Edited at %I:%M %p. ]s    [ Edited on %B %d at %I:%M %p. ]s%   [ Edited on %B %d, %Y, at %I:%M %p. ]R   R5   s   <I>s   </I>s   %s
%s
s   Sending edited post...s   Edit successful.R   Rm   s&   Your edited posting has been archived.s%   Draft cleared. Beginning new session.(   R  R  R  R  R;  R  R   R<  R   R)  t   blog_editeventR  R7  Rn  R  R+  R,  (   R   Rs  Rp  t   nowt   ts_text(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   go_edit=
  sD    
%
		c         C   se   d GHH| d k r$ |  j  j   } n |  j   } | d k r@ d S|  j   g  |  _ i  |  _ d GHd S(   s   Delete a post.s   Deleting...i   i    s   Deleted. Beginning new session.(   R)  t   blog_deleventR  R  R+  R,  (   R   Rs  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   go_delete
  s    
		c         C   sh  y t  | d  } Wn t k
 r' d SXi  } | j   } x | d k r"| d  } | d k rb n | d d k ru n t j | d d  } | d | | d <| d d	 k r | d |  _ nW | d d
 k rxD |  j j j   D]- } |  j j | | d k r | |  _ Pq q Wn  | j   } q= W| j	   x4 | j   D]& } | t
 k r:| | |  j | <q:q:Wd S(   s#   Read and set meta-data from a file.R   NRQ   ii    RW  R   i   R;   R<   (   R   R   R   R{   R   R*  R   R   RW   R   Rt  R  (   R   Rx  Rk   t   meta_inR   R   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   read_metadata
  s4    
	
c         C   s  t  j j |  } t  j j |  d k r: | |  j d <nF |  j d d | } t  j j |  d k rw | |  j d <n	 d GHd St  j j |  } t j t j | d  d d  } | d k r |  j	   n  t  j j
 |  d d	 | } t  j j |  d k r|  j |  n  d
 GHd S(   s7   Resume working on a previous draft, given its filename.i   Rm  R   R	  s:   Session unchanged. The specified draft file was not found.i    R{  is   .meta_s    Resuming previous draft of post.(   Rp   Rq   RR  Rr   R  R|  R{   R   R   Ru  Rw  R|  (   R   Rq  t	   is_virgint
   base_dfileRn  Rx  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   resume_draft
  s"    "R   c         C   sL  t  j j |  } t  j j |  d k r7 d | GHd Sy t | d  } Wn$ t k
 rp d | t   f GHd SX| j   } xg| d k rt j	 |  } | d k r q | j
 d d  \ } } | j   } | d k r3| d	 k ry t j | d
  } Wn! d GHt j t j    } n X|  j |  qn| d k rO| |  j d <n| d k rk| |  j d <nl| d k r| |  j d <nP| d k r| |  j d <n4| d k r|  j d d k r| |  j d <q| |  j d <n | d k r| |  _ n | d k r| |  j d <n | d k r2| |  j d <n | d k r]| d k r|  j |  qnz | d k ry|  j |  n^ | d  k r| j
 d!  } x@ | D] }	 d" |  j d# |	 <qWn | d$ k rn d% | | f GH| j   } q Wg  }
 | j   } x) | d k r$|
 j |  | j   } qWt j |
 d  |  j d& <| j   d S('   s(   Read in a post from an archive/template.i   s#   Error: That %s file does not exist.i    R   s   Error opening %sd post: %sRQ   RD  t   DateR   s   %Y-%m-%d %H:%Ms)   Malformed entry time. Setting to present.t   SubjectR7   t   JournalR8   t   PosterR9   t   CategoryR@   R   R  R  RA   R*  t   PictureR=   t   MusicR>   t   Securityt   customR   t   OptionsR   Rg   s   prop_opt_%st   ItemIDs'   Warning: Unrecognized directive. %s: %sR5   (   Rp   Rq   RR  Rr   R   R   Ra   R   R{   R   R   RZ  R;  R  R  R>  R  t   paramsR*  RX  R   R   R   (   R   Rh  t   atypeRk   R   t   elemt   valR  t   eoptst   eR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   read_archive
  s~    	
c         C   s   |  j    |  j | d  d k r& d St j t j    } t j d |  } |  j |  } | d k rl d S|  j |  y t |  j d d  } Wn d t	   GHd SX|  j j
 d  r | j |  j d  n  | j   d | GHd	 S(
   s5   Read in a template and create a draft file out of it.t   templatei    s   %Y%m%d_%H%M%SRm  R   s   Error writing draft file: %sR5   s   Successfully read template: %si   (   Ru  R  R;  R  R<  Rr  Rz  R   R  Ra   R  R   R   (   R   R  R=  Rn  Rp  Rk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   read_template4  s&    

	c   	      C   s  d GH|  j  d k r! |  j   n  d } |  j   } x' | D] } d | | f GH| d } q: WHt d  } Hd } | d k r| j d  } xi | D]a } y t |  } Wn t k
 r d } n X| d k r | t |  j j | | d  O} q q W| d k rd	 GHHqn  | S(
   s(   Choose what groups to place a friend in.s'   0. Don't put this friend in any groups.i    i   s   %d. %ss/   Group(s) to place friend in (list of numbers): RQ   R   is2   No valid groups specified. Defaulting to no group.(	   R'  R  Rk  RV   R   R   R   R   R   (	   R   R   RB  RZ   t   ginputR  t   glistR&  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   choose_friendgroupW  s2    
)c         C   si   t  d  j   } H| d k r# d Sd GHH|  j   } t d  } Ht d  } H|  j | | | |  d S(   s   Manage adding a friend.s'   Enter the username of your new friend: RQ   Ns%   These are your current friend groups.s+   Background color number to use for friend: s+   Foreground color number to use for friend: (   RV   RZ  R  R   R  (   R   R   R  R  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   add_friendu  s    c         C   s   |  j    s d St d  j   } H| d k r3 d Sy |  j | } Wn d GHd SXt g  t D] \ } } | | f ^ q^  } |  j   } y | d } Wn d } n X| d j   } | d j   }	 x0g  }
 x8 | D]0 } | t |  j	 j
 |  @r |
 j |  q q Wd	 GHHd
 | | GHd | |	 GHd t |
  d f | d k GHd | GHd GHH|  j   } | d k rwd S| d k r|  j | | |	 | d  d S| d  k rt d  } Hq | d! k rt d  }	 Hq | d" k r|  j   } q d GHHq d S(#   s   Edit an existing friend.Ns"   Enter the username of the friend: RQ   s   That user is not your friend.R  i    R  R  s   EDIT FRIEND MENUs   [b] Background color: %ss   [f] Foreground color: %ss   [g] Groups: %ss   (none)s   [u] Update (send edit for %s).s&   [r] Return to friends management menu.t   RR   t   Ut   ui   t   Bt   bs+   Background color number to use for friend: t   FRk   s+   Foreground color number to use for friend: t   GR&  s   That is not a valid option.(   R  R   (   R  R  (   R  R  (   R  Rk   (   R  R&  (   R  RV   RZ  R1  t   dictR   Rk  t   upperR   R   R   R   R   R=  R  R   R  (   R   R   R  Ri   t   ht   cdictt   frgrpsR  t   bgt   fgRj  RZ   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   edit_friend  s`    +
	c         C   s   d GH|  j    s d GHd S|  j   } d GHxT | D]L } d | |  j j | d	 | |  j j k |  j j | |  j j | f GHq2 Wd S(
   s   List friend groups.s$   Retrieving existing friend groups...s,   Could not obtain current friend groups data.i    s~   
Friend Group              Order    Public    Bit    Group Mask
------------              -----    ------    ---    ----------s   %-25s %5s    %6s    %3d    %10st   Not   Yesi   (   R  R  (   R  Rk  R   R   R   R   R   (   R   RB  RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   list_friendgroups  s    Jc   
         ss  |  j    s d SH|  j j j     t d d  } t   f d   |  } | j   | d } | d k rs d GHd St d  j   } | d k r d SHd } x^ | s t d	  } Hy t	 |  } Wn d } n X| d k  s | d
 k r d GHHq d } q Wd } xS | sXt d  j   } H| d k r:d }	 d } q| d k rd }	 d } qqW|  j
 | | | |	  d S(   s   Add a new friend group.Ni   i   c            s   d |  f |    k S(   NRQ   (    (   Ri   (   t   cur_grps(    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s    i    RQ   s=   You have already created the maximum number of friend groups.s   Enter new group name: s4   Enter sort order number (lower numbers come first): i   s&   That is not a valid sort order number.s   Make this group public? (Y/N): t   YRc   t   NRi   (   R  Rc   (   R  Ri   (   R  R   R   t   valuesR   R   Ri  RV   RZ  R   R"  (
   R   t   bitranget   diffst   freenumR  t   donet   ssortt   snumt   spubt   pub(    (   R  s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   add_friendgroup  sL    

	

		c         C   s|   t  d  j   j   } | d k r( d SH|  j j j   } t d   |  } y | | j |  } | SWn d GHd SXd S(   s(   Get a group number from an inputed name.s   Name of group: RQ   c         S   s
   |  j    S(   N(   RQ  (   RZ   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR     s    s   That is not a valid group.N(   RV   RZ  RQ  R   R   RW   R   t   index(   R   t   gsRB  t   gnamest   gkey(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   get_groupkey  s    c   	      C   s  |  j    s d SH|  j   } | d k r- d S|  j j | } t |  j j |  } | |  j j k rn d } n d } xYHd GHHd | GHd | GHd d | d k GHd GHd GHH|  j   } | d  k r d S| d! k rt d  j	   } H| d k r d GHq| } qw | d" k rnt d  j	   } Hy t |  } Wn d } n X| d k  s]| d k red GHq| } qw | d# k r| d k rd } d GHqd } d GHqw | d$ k r|  j
 | | | |  d Sd GHqw d S(%   s   Edit an existing friend group.NRQ   i   i    s   EDIT FRIEND GROUP MENUs   [n] Name: %ss   [s] Sort order: %ds   [p] Public: %ss   (no)s   (yes)s!   [u] Update (send edit for group).s"   [r] Return to administrative menu.R  R   R  Ri   s   Enter new group name: s   That is not a valid group name.t   SR`   s   Enter new sort order number: i   s&   That is not a valid sort order number.t   Pt   ps   This group will be public.s   This group will be private.R  R  s   That is not a valid option.(   s   (no)s   (yes)(   R  R   (   R  Ri   (   R  R`   (   R  R  (   R  R  (   R  R  R   R   R   R   R   R=  RV   RZ  R#  (	   R   R  R  R  R   RU   t   ngt   sgR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   edit_friendgroup!  sd    				
	c         C   sH   |  j    s d SH|  j   } | d k r- d S|  j |  j j |  d S(   s   Delete a friend group.NRQ   (   R  R  R$  R   R   (   R   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   del_friendgroup`  s    c         C   sb  d GHH|  j    } d } | d& k rC t d  } Ht j |  } n| d' k ry d d	 l } d d	 l } Wn t k
 r d
 GHd	 SX| j |  j d  } i  } x | D] } | j | d  r y t	 |  j d d |  } d | | d <| j
   }	 x |	 d k r}|	 d  }	 |	 d k r nN |	 d d k r3n; t j |	 d d  }
 |
 d d k rn|
 d | | d <Pn  | j
   }	 q W| j   Wqt k
 rqXq q W| j   } | j   d } x | D] } | d k  rd | Gn d | G| d  d | d d !d | d d !G| d d !d | d d !d | d d !Gt | |  d  k rft | | d   GHn	 | | GH| d } qWHt d!  } Hy t |  } Wn t k
 rd } n X| d k  s| t |  k rd" GHqd# | | d } n d$ GH| d k r^|  j d  |  j |  } x> | rZy |  j   } Wq t k
 rV|  j d%  q Xq Wn  d	 S((   s   Display a menu of old drafts.sQ   
SELECT DRAFT

[f] Enter filename of draft.
[l] Select from a list of old drafts.RQ   R  Rk   s   Enter filename of draft: t   Lt   liNs5   Your Python installation lacks the necessary modules.R   s   .meta_????????_??????R	  s   (no subject)i   i    RW  R   i   R7   i
   s   %d. s   %d.i   t   -i   i	   i   RD  i   i   i-   s   Enter draft number: s1   Invalid choice. You need to choose a valid draft.t   draft_s   That is not a valid option.t   posting(   R  Rk   (   R  R  (   R=  RV   R{   RZ  t   dircachet   fnmatchR  t   listdirR  R   R   R   R   R   RW   Ri  Rz   R   R   R   R  R  t	   post_menut   KeyboardInterruptR@  (   R   RU   Rq  R  R  R}   t   fkeysRi   Ry  R   R   RB  R   RZ   t	   repeat_ok(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   drafts_menuq  s    

&)	
	c         C   s   Hd GHHd } |  j  j   } x' | D] } d | | f GH| d } q# WHt d  } Hy t |  } Wn t k
 r} d } n X| d k  s | t |  k r d GHd S|  j | | d  |  j  | | d |  j d <d S(   s   Display a username menu.s   SELECT USERNAMEi   s   %d. %ss   Enter username number: i    s4   Invalid choice. You need to choose a valid username.R   (   R"  RW   RV   R   R   Rz   t   set_userR  (   R   R   RB  RZ   RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   username_menu  s*    
c         C   s   d GHt  d  } Ht j |  } | d k rE t j t j    } n0 y t j | d  } Wn t k
 rt d GHd SX|  j |  d S(   s   Set the posting time.s   
The date and time should be entered in YYYY-MM-DD HH:MM format.
The time is 24-hour time (00-23 for midnight - 11 pm).
Just press return without entering anything, to set this to the current time.
s   Enter date and time: RQ   s   %Y-%m-%d %H:%Ms$   Time format error. Time not changed.N(   RV   R{   RZ  R;  R  R  R   R>  (   R   R6  R=  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   select_time  s    c         C   s   |  j  j j   } | j   t | d  Ht d  } Hy t |  } Wn t k
 r` d } n X| d k  s | t |  k r d GHn$ | | d } |  j	 |  d | GHd S(   s   Select mood from list.i   s   Enter mood number: i    i   s   Invalid choice. Mood unchanged.s   Mood set to %s.N(
   R   R   RW   Ri  R   RV   R   R   Rz   RT  (   R   RB  RU   Ri   RR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   moodlist_menu  s    

c         C   s   d GHH|  j    } | d k r3 |  j d  d GHnf | d k ra t d  } |  j |  Hd	 GHn8 | d k r |  j j i  k r d GHq |  j   n d GHd S(   s   Mood selection menu.sh   
MOOD SELECTION MENU

[n] No mood.
[l] Select current mood from pre-defined list.
[o] Select other mood.R  Ri   RQ   s   Selected no mood.t   Ot   os   Mood: s   Mood selected.R  R  s#   No pre-defined moods are available.s   That is not a valid option.N(   R  Ri   (   R  R  (   R  R  (   R=  RT  RV   R   R   R  (   R   RU   RR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   mood_menu  s     c         C   s(  Hd GHHd GHd } x5 |  j  j D]' } t |  | k r t |  } q q Wt |  j  j d | d  H|  j   } y t |  } Wn t k
 r d } n X| d k r |  j d  d GHng | d k  r d	 GHnS y: |  j  j | d
 |  j d <d |  j  j | d
 d GHWn t	 k
 r#d	 GHn Xd S(   s!   Select picture keyword from list.s   PICTURE KEYWORD SELECTIONs   0.   (none)i    iN   i   iR=   s   No picture keyword selected.s$   Invalid choice. Selection unchanged.i   s	   Selected s	    picture.N(
   R   R   Rz   R   R=  R   R   R8  R  RS  (   R   t   maxlenRZ   RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   pickw_menu5  s2    
c         C   s  Hd GHHd } d Gy* |  j  d d k r5 d } d GHn d GHWn t k
 rS d GHn Xd } d	 Gy* |  j  d
 d k r d } d GHn d GHWn t k
 r d GHn Xd } d Gy* |  j  d d k r d } d GHn d GHWn t k
 r d GHn Xd } d Gy |  j  d d k rd GHna |  j  d d k r1d GHnF |  j  d d k rLd GHn+ |  j  d d k rgd GHn d |  j  d GHWn d GHn Xd Gy* |  j  d d k rd } d GHn d GHWn t k
 rd GHn Xd  GHH|  j   } | d= k r| d k rd |  j  d <d" GHq|  j  d =d# GHnz| d> k r^| d k rLd |  j  d
 <d& GHq|  j  d
 =d' GHn;| d? k r| d k rd |  j  d <d* GHq|  j  d =d+ GHn | d@ k r| d k rd |  j  d <d. GHq|  j  d =d/ GHn | dA k rd2 GH|  j   } | dB k rd |  j  d <d4 GHq| dC k r;d |  j  d <d5 GHq| dD k r\d |  j  d <d6 GHq| dE k r}d |  j  d <d8 GHqd9 GHn | dF k rn d; GHd< S(G   s   Miscellaneous option menu.s   MISCELLANEOUS OPTIONSi    s!   [a] Change auto-format option to:R   Rg   i   s#   on (post will be formatted for you)s   off (format your post yourself)s   [b] Change backdate option to:R   s   no backdatings   backdating ons   [c] Change comments option to:R   s   comments alloweds   comments disalloweds'   [s] Screen comments that are posted by:R?   t   At   everyoneR  s   anonymous usersR  s   non-friendsR  s   none (do not screen)s   unknown option %ss   [e] Change email option to:R   s   email commentss   do not email commentss   [r] Return to the posting menu.R  s   Auto-format turned off.s   Auto-format turned on.R  R  s   Post will be backdated.s   Post will not be backdated.t   CR   s   Comments will be disallowed.s   Comments will be allowed.t   ER  s   Comments will not be emailed.s   Comments will be emailed.R  R`   s   
SELECT A SCREENING LEVEL

[n] Don't screen any comments.
[e] Screen comments posted by everyone.
[a] Screen comments posted by anonymous users.
[f] Screen only comments posted by non-friends.
Ri   s   Comments will not be screened.s   All comments will be screened.s$   Anonymous comments will be screened.Rk   s%   Non-friend comments will be screened.s   That is not a valid choice.R   s   That is not a valid option.N(   R  R  (   R  R  (   R  R   (   R  R  (   R  R`   (   R  Ri   (   R  R  (   R  R  (   R  Rk   (   R  R   (   R  R   R=  (   R   t   val_preformatt   val_backdatet	   val_nocomt   val_noemailRU   t   slev(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   option_menuU  s    									



c         C   s  Hd GHHd |  j  d d GHd } g  } x} |  j j D]o } |  j j |  rm | j d | |  j | f  n | j |  t | d  | k r4 t | d  } q4 q4 Wt | d | d	  H|  j   } y t	 |  } Wn t
 k
 r d } n X| d k r|  j d
  d GHn | d k  r(d GHn yp |  j j | d } | |  j  d
 <d | GH| r|  j j |  r|  j  j d  r|  j |  j |  n  Wn t k
 rd GHn Xd S(   s   Journal selection menu.s   JOURNAL SELECTION MENUs   0.   (R   s   ) -- defaulti    s   %s (picture: %s)iiN   i   R8   s$   Selected default journal (your own).s$   Invalid choice. Selection unchanged.i   s   Selected %s.R=   N(   R  R   R   R.  R  R   Rz   R   R=  R   R   R8  RQ  RS  (   R   t	   changepicR  t   jlistRZ   RU   Ri   t   jname(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   journal_menu  sB    !
	c         C   sD  |  j  d k r |  j   n  |  j j i  k rV d |  j d <d |  j d <d GHd GHd SHd	 GHHd
 GHd } |  j   } x' | D] } d | | f GH| d } q{ WHt d  } H| d k r d GHd St j | d  } d } d } x | D] } y t	 |  }	 Wn t
 k
 rd }	 n X|	 d k rEd GHd |  j d <d |  j d <d S|	 d k  sc|	 t |  k rod | GHq | t	 |  j j | |	 d  O} | d 7} q W| d k rd GHd Sd |  j d <t |  |  j d <g  }
 x> |  j   D]0 } | t	 |  j j |  @r|
 j |  qqWd d t |
  d k t |
  f GHd S(   s-   Select friend group for security permissions.i    R,  R)   Rg   R:   s   No friend groups defined.s#   Security level set to friends only.Ns   CHOOSE FRIEND GROUPs   0. All friendsi   s   %d. %ss-   Friend group(s) permitted (list of numbers): RQ   s-   Nothing selected. Security level not changed.R   is"   Security level set to all friends.s#   Warning: '%s' is an invalid choice.s0   No valid selections. Security level not changed.s#   Security level set to friend %s: %st   groupst   group(   s   groupss   group(   R'  R  R   R   R  Rk  RV   R{   R   R   R   Rz   R_   R   R   (   R   R   RB  RZ   RU   t   nlistt   succR  t   numRi   Rj  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   friendgroup_menu  sd    
"c         C   s   d GHH|  j    } | d k r@ d |  j d <|  j d  d GHnz | d k rn d
 |  j d <d |  j d <d GHnL | d k r |  j   n3 | d k r d |  j d <|  j d  d GHn d GHd S(   s    Security permissions level menu.s   
SET SECURITY PERMISSIONS FOR POST

[d] Set security level to public (default).
[f] Set security level to friends only.
[c] Set security level to custom (select friend groups).
[p] Set security level to private.t   DR[   RU  R)   R:   s   Security level set to public.R  Rk   R,  Rg   s#   Security level set to friends only.R  R   R  R  R-  s   Security level set to private.s   That is not a valid option.N(   R  R[   (   R  Rk   (   R  R   (   R  R  (   R=  R  R8  R  (   R   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   security_menu?  s$    	c         C   s_   d G|  j  j d  rV t |  j  d  d k rG t |  j  d d  GHq[ |  j  d GHn d GHd S(   s!   Menu option for changing subject.s   [s] Change subject:R7   i-   s   (none)N(   R  R  Rz   R   (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   menu_opt_subject^  s    c         C   sc   d | G|  j  j d  rZ t |  j  d  d k rK t |  j  d d  GHq_ |  j  d GHn d GHd S(   s*   Menu option for changing category or tags.s   [c] Change %s:R@   i-   s   (none)N(   R  R  Rz   R   (   R   t   namestr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   menu_opt_tagsk  s    c         C   sr   d G|  j  j d  ri |  j  d d k ri t |  j  d  d k rZ t |  j  d d  GHqn |  j  d GHn d GHd S(   s%   Menu option for changing non-LJ tags.s   [k] Change keyword tags:RA   RQ   i-   s   (none)N(   R  R  Rz   R   (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   menu_opt_keywordsx  s    %c   	      C   s  Hd GHHd GH|  j  d k r( |  j   n  |  j j j   d } g  } x} |  j j D]o } |  j j |  r | j d | |  j | f  n | j |  t | d  | k rQ t | d  } qQ qQ Wt	 | d | d  Ht
 d  } Hg  } | j d	  } d
 | k rt
 d  } d | k r| j d  } xO | D]G } | j   } | j |  | |  j j k r6|  j j j |  q6q6Wd GHq| } | j |  | |  j j k r|  j j j |  n  d GHn  x | D] } y t |  } Wn t k
 rd } n X| d k r| t |  j j  k r|  j j | d } | | k rZ| j |  qZqqW| g  k rsd GHd St j | d  |  j d <d GH|  j j d  sy? x8 | D]0 } |  j j |  r|  j |  j |  d SqWWqqXn  d S(   s=   Change a list of LJ tags, applying pic keywords if necessary.s	   TAGS MENUs   0.   (use one or more new tags)i    s   %s (picture: %s)iiN   i   s,   Tag(s) to give this post (list of numbers): R   Rm   s6   Enter one or more new tag names, separated by commas: RP  s   New tags defined.s   New tag defined.i   s.   Warning, no valid tags chosen. Tags unchanged.s   , R@   s   Tags changed.R=   (   R(  R  R   R   Ri  R/  R  R   Rz   R   RV   R   RZ  R   R   R{   R   R  RQ  (	   R   R  t   tlistRe   RU   t	   post_tagsR  t   nstrRi   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   tags_menu  sv    !
$c         C   s9   | |  j  j k r( |  j  j j |  n  | |  j d <d S(   s   Set a tag directly.R@   N(   R   R   R   R  (   R   t   tname(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_tag  s    c         C   s   | |  j  d <d S(   s   Set keyword tags directly.RA   N(   R  (   R   t   kstr(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_keywords  s    c         C   s   d GHd } |  j  j d  r[ y! t j |  j  d  t j } Wq[ t k
 rW d } q[ Xn  | d k ro d GHn	 d | GHd GHd GH|  j  j d  r d	 GHn  | d k r d
 GHn
 d GHd GHd GHd GHd GHHd S(   s$   Menu option for dealing with drafts.s   ---i    Rm  s'   [d] Display current post (no text yet).s$   [d] Display current post (%d bytes).s"   [v] Validate/spellcheck this post.s7   [x] Alter post via external filter (will modify draft).R6   s:   [X] Revert to draft prior to any applied external filters.s#   [u] Update (send the current post).s$   [u] Update (submit the edited post).s3   [w] Wipe out this post (delete it from the server).s   [f] Copy current post to file.s   [r] Return to main menu.s	   [q] Quit.N(   R  R  Rp   R  R  Rt   (   R   t	   edit_onlyt   dsize(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   menu_opt_common  s,    !	c         C   s  H| GHHd GH| d k ri |  j  j g  k ri d Gy |  j d GHWqi t k
 re d |  j d d GHqi Xn  |  j   |  j d  d	 G|  j d
 k r d GHn |  j GH|  j  j g  k r d G|  j d d  GHn  d G|  j j	 d  d k r |  j
   GHn |  j d  GHd Gy |  j d d k r|  j d d k r:d GHqt |  j d  } g  } x> |  j   D]0 } | t |  j  j |  @r`| j |  q`q`Wd t |  d GHn |  j d GHWn t k
 rd GHn Xd G|  j j	 d  rd g } n	 d g } |  j j	 d  r| j d   n/ |  j j	 d!  r?| j d"  n | j d#  |  j j	 d$  rn| j d%  n  |  j j	 d&  r| j d' i d( d) 6d* d+ 6d, d- 6d. d/ 6|  j d&  n  t j | d0  GHd1 G|  j j	 d2  r|  j   GHn d3 GH|  j |  |  j   } | d` k rd S| da k r7|  j   n| db k rP|  j   n| dc k ri|  j   n| dd k r|  j   n| de k r|  j   nl| df k r|  j   nS| dg k r| d k r|  j  j g  k r|  j |  n| dh k r|  j   n| di k r3|  j  j g  k r3|  j   n| dj k rL|  j   n| dk k re|  j   n| dl k r~|  j    n| dm k rt! dM  } t j" |  } | d
 k r|  j# d  dN GHn | |  j d <dO GH|  j# d  Hn| dn k r5t! dR  }	 |	 dS  |  j dT <Ht$ |	  dS k r-dU GHqdV GHn | do k rcd }
 x |
 r_|  j%   }
 qJWn | dp k r|  j& | dY k  n | dq k r| d k r|  j'   } n |  j(   } | d k rd Sn< | dr k r| d k r|  j)   } | d k rd Sn d_ GHd S(s   s?   Common menu between editing previous post, and regular posting.s   [e] Edit text of current post.i    s   [j] Change journal to post in:R8   RA  R   RB  R   s   [m] Change mood:RQ   s   (none)s   [k] Change picture keyword:R=   s	   (default)s   [a] Change current music:R   i   R>   s    [p] Change security permissions:R)   R,  R:   Rg   R  s   custom (RU  s   [o] Change other options:R   s   don't auto-formats   auto-formatR   s   no commentsR   s   comments okay (but not emailed)s   comments okayR   RZ  R?   s	   screen %sR  R  t	   anonymousR  s   non-friendsR  RO  R  s   , s)   [t] Change time and date of current post:R0   s   (posting time)R   R   t   qt   Zt   zR  R[   t   VR   Rk   R  R  t   Jt   jt   MR  t   KRZ   R  R  R  R  t   TRe   R  s   Current music: s   Selected: no current music.s   Selected current music.R  R`   s	   Subject: i   R7   s6   Subject changed. WARNING: Truncated to 255 characters.s   Subject changed.R  R   t   XR   R  R  t   WR   s   That is not a valid option.(   R  R   (   R   R  (   R   R  (   R  R[   (   R  R   (   R  Rk   (   R  R  (   R  R  (   R  R  (   R  RZ   (   R  R  (   R  R  (   R  Re   (   R  R  (   R  R`   (   R  R   (   R  R   (   R  R  (   R	  R   (*   R   R   R  R   R  R  R*  R   R7  R  Rh  R   Rk  R   R   R   R{   R   R:  R  R=  R>  R9  Rg  R4  Ri  R2  R  R  R  R  R  R  RV   RZ  R8  Rz   R  R<  Rt  Rx  Rz  (   R   t   header_textR  R0  Rj  RZ   t   opt_listRU   t   m_textt	   subj_textR  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   common_menu  s    
			c         C   s   |  j  d d  S(   s
   Post menu.s	   POST MENUi    (   R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s    c         C   s   d GH|  j    } | d k r! d S| d k r: |  j   n | d k rS |  j   n | d k rl |  j   ni | d k r |  j   nP | d k r |  j   n7 | d k r |  j   n | d k r |  j   n d GHd S(   s5   Menu for console commands and other XML-RPC features.s&  
ADMINISTRATIVE MANAGEMENT MENU

[f] List, add, remove, or edit friends.
[g] Add, remove, or edit friend groups.
[c] Add or remove community users.
[b] Ban or unban users from your journal or community.
[s] Grant or revoke posting access to a shared journal.
[r] Return to main menu.
[q] Quit.
R  R   i    R   R  R   R  R  R  R  R   R  Rk   R  R&  R  R`   s   That is not a valid option.i   (   R  R   (   R   R  (   R   R  (   R  R  (   R  R   (   R  Rk   (   R  R&  (   R  R`   (   R=  R>  R9  t   ban_menut   community_menut   friends_menut   admin_groups_menut   sharedjour_menu(   R   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   admin_menu  s(    c         C   s   d GH|  j    } | d k r! d S| d k rL d d g } |  j | g  nf | d k re |  j   nM | d k r t d  } H|  j | j    n | d k r |  j   n d GHd S(   s   Friends management menu.s   
FRIENDS MANAGEMENT MENU

[l] List friends.
[f] Add someone as a friend.
[e] Edit the colors and groups of a friend.
[u] Un-friend someone.
[r] Return to administrative menu.
R  R   NR  R  R  R}   R  Rk   R  R  s!   Enter the username to un-friend: R  R  s   That is not a valid option.(   R  R   (   R  R  (   R  Rk   (   R  R  (   R  R  (   R=  R  R  RV   R  RZ  R  (   R   RU   t   cmdR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s     c         C   s   d GH|  j    } H| d k r" d S| d k r; |  j   nP | d k rT |  j   n7 | d k rm |  j   n | d k r |  j   n d GHd S(   s-   Friend group management: add, remove, update.s   
FRIEND GROUP MANAGEMENT MENU

[l] List friend groups.
[a] Add a new friend group.
[d] Delete an existing friend group.
[e] Edit a friend group.
[r] Return to administrative menu.
R  R   NR  R  R  R  R  R[   R  R  s   That is not a valid option.(   R  R   (   R  R  (   R  R  (   R  R[   (   R  R  (   R=  R  R  R  R  (   R   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s    c         C   s   d GH|  j    } | d k r! d S| d k r t d	  } Hd
 | j   g } | d k rh | j d  n | j d  t d  } Hg  } x8 | j d  D]' } | } | j |  | j |  q W|  j |  n d GHd S(   s'   Community management: add/remove users.s   
COMMUNITY MANAGEMENT MENU

[a] Add users to a community.
[u] Unsubscribe users from a community.
[r] Return to administrative menu.
R  R   NR  R  R  R  s   Enter the community name: t	   communityR  t   removes'   Enter usernames (separated by spaces): R   s   That is not a valid option.(   R  R   (   R  R  R  R  (   R  R  (   R=  RV   RZ  R   R   R  (   R   RU   t   cnameR  t   unamest   clistR  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s(    	c   	   	   C   s  d GH|  j    } | d k r! d S| d k r| d k rE d g } n	 d g } | d k r t d  } | d k r{ d GHd Sd | j   g } Hn g  } t d  } | d k r Hd GHd SHg  } xB | j d  D]1 } | } | j |  | | 7} | j |  q W|  j |  n d GHd S(   s,   Ban/unban users from a journal or community.s   
BAN MANAGEMENT MENU

[b] Ban users from your journal.
[u] Unban users from your journal.
[e] Exile (ban) users from a community.
[a] Allow (unban) users back into a community.
[r] Return to administrative menu.
R  R   NR  R  R  R  R  R  R  R  t   ban_sett	   ban_unsets   Enter the community name: RQ   s   No community entered.t   froms'   Enter usernames (separated by spaces): s   No usernames entered.R   s   That is not a valid option.(   R  R   (   R  R  R  R  R  R  R  R  (   R  R  R  R  (   R  R  R  R  (   R=  RV   RZ  R   R   R  (	   R   RU   R  R  t   cargsR  R  R  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR  $  s<    	
c         C   s   d GH|  j    } | d k r! d S| d k r t d	  } Hd
 | j   g } | d k rh | j d  n | j d  t d  } Hg  } x8 | j d  D]' } | } | j |  | j |  q W|  j |  n d GHd S(   s1   Grant or revoke posting access to shared journal.s   
SHARED JOURNAL MANAGEMENT MENU

[a] Allow users to post in a shared journal.
[d] Disallow users from posting in a shared journal.
[r] Return to administrative menu.
R  R   NR  R  R  R[   s   Enter the shared journal name: t   sharedR  R  s'   Enter usernames (separated by spaces): R   s   That is not a valid option.(   R  R   (   R  R  R  R[   (   R  R  (   R=  RV   RZ  R   R   R  (   R   RU   R  R  R  R  R  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR  S  s(    	c         C   s   |  j    } | d k r d S|  j j d  rM |  j d k rM |  j   qM n  d } xA | r y |  j d d  } WqV t k
 r |  j d  qV XqV Wd S(   s   Edit previous post.i    i   R:   s   EDIT PREVIOUS JOURNAL ENTRYRs  (   R  R  R  R'  R  R  R  R@  (   R   Rp  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   edit_previous_postx  s    	c         C   s   | |  _  d S(   s!   Given an entry object, choose it.N(   R,  (   R   t   eobj(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   pick_entry  s    c         C   s%  t  |  j  } | d k r$ d GHd S| d k rM d GH|  j |  j d  d SHd GHHd } xO |  j D]D } | d k  r d | Gn d	 | G| d
 d | d GH| d } qd WHt d  } Hy t |  } Wn t k
 r d } n X| d k  s | | k rd GHn d GH|  j |  j | d  d S(   s(   Pick something from the list of entries.i    s   No entries available.Ni   s   One entry returned. Selecting.s   SELECT FROM LISTi
   s   %d. s   %d.R;  R   R7   s   Enter entry number: s   Invalid choice.s	   Selected.(   Rz   R+  R"  RV   R   R   (   R   t   llistR   R  RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   pick_from_list  s:    
c         C   s   t  d  } Hy t |  } Wn t k
 r6 d } n X| d k  sO | d k rX d GHd Sd |  j d <t |  |  j d	 <|  j d	 g  } | d k r d S|  j   d S(
   s   Select from last N entries.s5   Enter the number of entries to retrieve (max of 50): i    i   i2   s(   You must pick a number between 1 and 50.Nt   lastnR  t   howmany(   RV   R   R   R  R_   R  R$  (   R   RU   Ri   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   pick_lastn  s    
c         C   s  t  j t  j  t j t j    } Ht  j | d | d  HHd } x | rd GHHt d  } Ht j |  } | d k r | r d GHd Sd GHt	  n  y t j
 | d  } d } WqI t	 k
 ry t j
 | d	  } Wn t	 k
 r d GH  n X|  j | d | d  HqI XqI W| S(
   s*   Choose a date, with the aid of a calendar.i    i   s   You can enter the date in YYYY-MM-DD format to select a date, or YYYY-MM to
see a calendar of that month, which will show the number of posts per day.s   Enter date: RQ   s.   No date entered. Synchronization will be used.s   Invalid date format.s   %Y-%m-%ds   %Y-%m(   RD  t   setfirstweekdayt   SUNDAYR;  R  RE  RV   R{   RZ  R   R  RO  (   R   t   none_okR=  R  R6  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   select_date  s>    		
	c         C   s   y |  j    } Wn t k
 r$ d SXt j d |  |  j d <t j d |  |  j d <t j d |  |  j d <d |  j d <|  j d d d g  } | d	 k r d S|  j   d S(
   s&   Select from entries on a certain date.Ns   %YR0   s   %mR  s   %dR2   R  i    (   R+  R   R;  R<  R  R  R$  (   R   R  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   pick_date  s    c         C   sr   d |  j  d <d |  j  d <|  j d g  } | d k r< d St |  j  d k rZ d GHd S|  j |  j d  d S(	   s   Select the most recent post.R  R  s   -1R  i    Ni   s*   Error: Server returned more than one post.(   R  R  Rz   R+  R"  (   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   pick_most_recent  s    c         C   s  Hd GHH|  j  j g  k rX d Gy |  j d GHWqX t k
 rT d |  j d d GHqX Xn  d GHd GHd	 GH|  j i  k r d
 G|  j d Gt |  j d  d k r t |  j d d  GHq |  j d GHn  d GHd GHH|  j   } | d# k r d S| d$ k r|  j   n | d% k r|  j	   n | d& k rI|  j  j g  k rI|  j
   n{ | d' k rb|  j   nb | d( k r{|  j   nI | d) k r|  j   n0 | d* k r|  j i  k r|  j   } | Sd! GHd" S(+   s   Select old post to edit.s   SELECT PREVIOUS POSTs%   [j] Change journal to take post from:R8   RA  R   RB  s'   [l] Select the last (most recent) post.s-   [n] Select from the last N number of entries.s1   [d] Select from entries posted on a certain date.s   [e] Edit post:R;  R7   i-   s   [r] Return to main menu.s	   [q] Quit.R  R   i    R   R  R   R  R  R  R  R  R  Ri   R  R[   R  R  s   That is not a valid option.i   (   R  R   (   R   R  (   R   R  (   R  R  (   R  R  (   R  Ri   (   R  R[   (   R  R  (   R   R   R  R   R,  Rz   R   R=  R>  R9  R  R-  R'  R,  R   (   R   RU   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   pick_edit_menu"  sR    c         C   s_  y |  j  d | |  j d <Wn t k
 r0 d SXy! t j |  j  d | d  } Wn[ t k
 r y! t j |  j  d | d  } Wq t k
 r t j t j    } q Xn X|  j d | d d	 d
 d g  x{ t d | d  D]f } yL |  j  d | |  j d k r5|  j  d | |  j d |  j  d | <n  Wq t k
 rIq Xq W|  j	 |  d S(   s&   Populate data from one of many events.s   events_%d_itemidR  i    s   events_%d_eventtimes   %Y-%m-%d %H:%M:%Ss   %Y-%m-%d %H:%Ms
   events_%d_R9   R)   R:   R7   i   s   prop_%d_itemids   prop_%d_valueR  s   prop_%d_name(
   R%  R  R   R;  R  R   R  RC  R   R  (   R   Ri   t   pcmaxR=  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   copy_event_metadata[  s.    .c         C   s8  y t  |  j d  } Wn t k
 r0 t  n X| d k  rF t  n  y; |  j d } y t  |  } Wn t k
 r t  n XWn t k
 r d } n Xd } x t d | d  D]{ } |  j   | d k r | |  j d <n  |  j | |  } | d k r| d } q |  j d t	 j
 |  j d |   q W| S(   sB   Archive multiple events retrieved from the network. Return errors.R  i   R  i    RQ   R8   s   events_%d_event(   R   R%  R   R   R   Ru  R  R0  Rn  R   R  (   R   t   journal_nameR  R  R/  t   err_nRi   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   archive_events  s0    
	

(c         C   s  y |  j  d } Wn t k
 r* d } n Xd } d } t |  d | }	 xt | | d  D]u}
 d |
 } | j |	 |  r_ y |  j | | |
 d d d d d d f	  |  j |  } d |	 | f G| d k r | | } d | | |	 | f Gn | |	 | G| |	 | d	 k r!d
 GHn d GH| t | |	 |  | } Wno t k
 r}d |	 | f GH| t | |	 |  } n8 t	 k
 rd |	 | f GH| t | |	 |  } n X| d k r| |  j  d <qq_ q_ W| | f S(   s1   Archive posts in a day range (in a single month).R8   RQ   i    s   -%02d-i   s   %02ds     %s%s:s/   PARTIAL FAILURE. Errors encountered on %d of %sRg   s   post.s   posts.s     %s%s: FAILED. Network error.s#     %s%s: FAILED. No posts retrieved.(
   R  R   R_   R   R  R  R3  R   R   R   (   R   t   s_yeart   s_mont   s_dayt   e_dayt
   day_countst   save_journalt   countR2  RH  Ri   R6  t   new_errs(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   archive_days  s>    

(
 c         C   sw  |  j  j d  r4 |  j  j d  r4 |  j   d Sy |  j  d } Wn t k
 r^ d GHd SXy |  j  d } Wn& t k
 r t j t j    } n Xd GH|  j   } | d k r d Si  } x( |  j j   D] } |  j | | | <q Wd } | d | d k rd } nh | d | d k rv| d | d k r?d } qv| d | d k rv| d | d k rsd } qsqvn  | d k r| } | } | } n  | d | d k r| d | d k rHd	 GH|  j	 | d | d | d | d |  } n t j
 d
 | d | d d d d d d d d f	  } Hd | | d | d f GH|  j	 | d | d | d t j | d | d  d |  } | d }	 | d }
 | d | d k rs| d d k rsx t | d d d  D] } t j
 d
 | d | d d d d d d d f	  } Hd | | d f GH|  j	 | d | d t j | d |  d |  } |	 | d }	 |
 | d }
 qWn  | d | d d k rRx t | d d | d  D] } x t d d  D] } t j
 d
 | | d d d d d d d f	  } Hd | | f GH|  j	 | | d t j | |  d |  } |	 | d }	 |
 | d }
 qWqWn  | d | d k r}| d | d k r}n| d | d k s| d | d d k r| d | d k r| d d } n d } x t | | d  D] } t j
 d
 | d | d d d d d d d f	  } Hd | | d f GH|  j	 | d | d t j | d |  d |  } |	 | d }	 |
 | d }
 qWn  t j
 d
 | d | d d d d d d d d f	  } Hd | | d | d f GH|  j	 | d | d d | d |  } |	 | d }	 |
 | d }
 H|	 d k r4d |	 Gn d G|
 d k rLd GHn |
 d k r`d GHn	 d |
 GH|  j   d S(   s@   Given two dates, archive posts between those dates, inclusively.t
   start_ttupt   end_ttupNs+   You must specify a start date for archival.s   Retrieving post counts...i    i   i   s   Archiving...s   %Bs   Archiving from %s %d, %d...i   i   s   Archiving %s %d...s   Archiving up until %s %d, %d...s   Archived a total of %d posts.s   Archived one post.s
   No errors.s   Failed to archive one post.s   Failed to archive %d posts.(   R  R  t   mass_synchronizeR   R;  R  R  R%  RW   R<  R<  RD  t
   monthrangeR   Rv  (   R   t   sttt   ettRp  t   save_countsRZ   t   mttR  t   mstrR:  R2  R   R  t   s_month(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   mass_archive  s    &
			(.5	

$1	"-	(,	(	5'	c         C   s  |  j  j d k r7 |  j  j |  j d <d |  j  j GHn d GH|  j   d k rW d GHd Sy t |  j d  } Wn d	 GHd SX| d k r d
 GHd Sd | GHi  } d* } d } x| | k  r_| d k rd | t |  | d f GHd } d } x | d k r| d |  j d <|  j   } | d k r d | d k rJd | d GHn d d | GHt j d |  | d k  r| d 9} qq q Wn  t |  j d  } x t	 d | d  D] } | d 7} |  j d | d  d k r|  j d | }	 t j
 t j |	 d   }
 |
 | d k r(|
 |	 f } n  |	 |
 |  j d | f | |  j d | d <qqWq W| i  k r~d t |  GHn	 d GHd Sy |  j d } Wn t k
 rd } n X|  j  j d k r|  j  j |  j d <n |  j d  x| i  k rd } d } x | d k r|  j   } | d k rXy t |  j d  } WqXd GHd } qXXn  | d k rd | d k rd  | d GHn d! d | GHt j d |  | d k  r| d 9} qqqW|  j |  } | d k rd" | | d+ | d k f GHn d% | d, | d k f GHxO t	 d | d  D]: } y | |  j d& | =Wq)d' |  j d& | GHq)Xq)W| i  k rd- } x< | j   D]. \ }	 }
 } |
 | d k  r|
 |	 f } qqW| d |  j d <n  | d k r| |  j d <qqWd) | d GH| d |  j  _ d S(.   s.   Mass-download the journal since the last sync.RQ   R   s   Synchronizing posts since %s...s.   No previous synchronization. Obtaining data...i    s6   Failed to retrieve item count. Please try again later.Nt
   sync_totals<   No valid synchronization item count. Please try again later.s*   No changes since the last synchronization.s!   Found %d new and changed items...s4     Fetching item list, %d items remaining after %s...i   i   i<   s)   Pausing %d minutes before trying again...i   s)   Pausing %d seconds before trying again...i   i   t
   sync_counts   sync_%d_items   L-s   sync_%d_times   %Y-%m-%d %H:%M:%Ss   sync_%d_actions    Retrieving %d journal entries...s6   No journal entries to fetch. Synchronization complete.R8   R  s     FAILED. No posts retrieved.s+     Pausing %d minutes before trying again...s+     Pausing %d seconds before trying again...s7       PARTIAL FAILURE. Errors encountered on %d of %d %s.t   entriest   entrys       Archived %d %s...s   events_%d_itemids1       DUPLICATION. Previously retrieved item ID %s.is/   Synchronization complete. Most recent item: %s.(   i    RQ   (   s   entriess   entry(   s   entriess   entry(   iRQ   (   R   R   R  R  R   R%  Rz   R;  R*  R   R  R  R   R8  R  R3  R  (   R   t   need_to_gett
   fetch_listt   most_recentt   seenR  t   backoffR:  R   Re   t   secsR9  R  R;  t   least_recentt   act(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR?  a  s    	
8
c         C   so   d GHH|  j    } | d k r. d |  j d <n= | d k rJ d |  j d <n! | d k rf d |  j d <n d GHd S(   s   Select organization method.s   
SELECT ARCHIVE ORGANIZATION

[n] Do not create subdirectories.
[y] Create a subdirectory for each year.
[m] Create a subdirectory for each month.R  Ri   RO  R   R  Rc   R0   R  R  R  s   That is not a valid option.N(   R  Ri   (   R  Rc   (   R  R  (   R=  R  (   R   RU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   organize_menu  s    c         C   s  Hd GHH|  j  j g  k rX d Gy |  j d GHWqX t k
 rT d |  j d d GHqX Xn  d Gy t j d |  j d	  GHWn> t k
 r |  j  j d
 k r d GHq d |  j  j d  GHn Xd Gy t j d |  j d  GHWn t k
 r d GHn Xd |  j d GHd |  j d GHd GHd GHd GHH|  j   } | d. k r>d S| d/ k rW|  j   nZ| d0 k rp|  j	   nA| d1 k r|  j  j g  k r|  j
   n| d2 k r|  j   n | d3 k ry< |  j d%  } | d
 k r| |  j d	 <n |  j d	  Wqt k
 rqXn | d4 k rMy |  j   |  j d <Wqt k
 rIqXnd | d5 k rHt d*  } Ht j j |  } t | d+  } | d k rd, GHq| |  j d <n d- GHd% S(6   s   Select posts to archive.s   SELECT POSTS TO ARCHIVEs&   [j] Change journal to take posts from:R8   RA  R   RB  s*   [s] Select start date of posts to archive:s   %Y-%m-%dR=  RQ   s   (synchronize)s   (synchronize from %s)is(   [e] Select end date of posts to archive:R>  s   (today)s   [d] Change archive directory: R   s!   [o] Change archive organization: R   s   [a] Run archive.s   [r] Return to main menu.s	   [q] Quit.R  R   i    R   R  R  R  R  R  R  R  R  R`   i   R  R  R  R[   s%   Directory to use as base of archive: R   s   Archive directory unchanged.s   That is not a valid option.(   R  R   (   R   R  (   R  R  (   R  R  (   R  R  (   R  R`   (   R  R  (   R  R[   (   R   R   R  R   R;  R<  R   R=  R>  RG  R  RT  R+  R8  R   RV   Rp   Rq   RR  Rx   (   R   RU   Re   Rl  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   pick_archive_menu  s|    	c   	      C   s  Hd GHH|  j  d k r- d |  j d d GHn  d GHH|  j   } |  j  d k rs | d1 k rs t GHH|  j   Ht GHnS| d2 k r H|  j   |  j   Hn.| d3 k r d } x| r y |  j   } Wq t k
 r |  j	 d  q Xq Wn| d4 k rwt
 d  } H| d k rd GHq|  j |  } | rd } x> | rpy |  j   } Wq6t k
 rl|  j	 d  q6Xq6WqnO| d5 k r|  j   n6| d6 k r|  j   |  j   d } x| ry |  j   } Wqt k
 r|  j	 d  qXqWn| d7 k r|  j   |  j   |  j d } |  j d } |  j d } d |  j d <d } x; | ry |  j   } WqTt k
 r|  j	 d  qTXqTW| |  j d <| |  j d <| |  j d <n| d8 k rd } x | ry |  j   } Wqt k
 r|  j	 d  qXqWn | d9 k r%|  j   n | d: k r>|  j   n | d; k rTt   nr | d< k ryE d) d* l } | j d+ t j |  j d, d-  d. |  j d f  Wqt k
 rd/ GHqXn d0 GHd* S(=   s
   Main menu.s	   MAIN MENUi    s   [l] Log in as R   Ry   sp  [p] Post a journal entry.
[t] Read in a template, then post a journal entry.
[r] Resume working on a previous draft.
[e] Edit or delete a posted journal entry.
[a] Archive past journal entries.
[v] View your current journal page.
[f] Administrate friends and communities.
[c] Check if your friends have posted updates.
[i] Information about the Charm client.
[q] Quit.R  R  R  R   R  R  i   R  R  Re   s   Enter the template filename: RQ   s   You did not enter a filename.R  R   R  R  t	   selectionR  R  R   R   R   Rm   R  Rk   R   R  R   R  t   IR   R  R   iNs   http://%s/users/%sR+   R	  i   sE   Sorry. Your Python installation lacks the required webbrowser module.s   That is not a valid option.(   R  R  (   R  R   (   R  R  (   R  Re   (   R  R   (   R  R  (   R  R  (   R  Rk   (   R   R  (   R   R  (   RW  R   (   R  R   (   R&  R  R=  RM   R  R'  R  R  R  R@  RV   R  R  R  Ru  R.  RU  R  R9  R>  RP   t
   webbrowserR   R{   R   R  (	   R   RU   R  R  Rp  t   old_archive_dirt   old_archive_subdirst   old_organizeRX  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   main_menuN  s    


		

	

		
9c         C   s   | |  j  d <y |  j | } t |  d k r? | |  j  d <n t |  d k r | d |  j  d <| d |  j  d <d |  j  d <n@ | d |  j  d <| d |  j  d	 <| d |  j  d
 <d |  j  d <Wn n Xd S(   s4   Set the user, setting the URL associated if need be.R   i   R+   i   i    t   appkeyR"   R  t   basefeedt   sslt   atomN(   R  R#  Rz   (   R   t   unameR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR    s    c         C   s   y d d l  } | j  d  } Wn t d  } n XHt j |  } | d k rZ d GHd St |  |  j d <H|  j d |  j |  j d <d	 S(
   s   Get a user's password.iNs   LiveJournal Password: RQ   s)   You need to enter a LiveJournal password.i    R   R   i   (   t   getpassRV   R{   RZ  R   R  R"  (   R   Rb  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   get_pass  s    c         C   s  |  j  i  k rX Ht d  } Ht j |  } | d k rA d GHd S|  j |  |  j   S| d k r |  j |  |  j  j |  r |  j  | |  j d <d S|  j   St |  j   d k r |  j |  j  j	   d  |  j  |  j  j	   d |  j d <d S|  j
   } | d k rd Sd S(   s2   Figure out what username and password we're using.s   LiveJournal Username: RQ   s)   You need to enter a LiveJournal username.i    R   i   (   R"  RV   R{   RZ  R  Rc  R  R  Rz   RW   R  (   R   t   def_userR   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   get_userpass  s0    

!c         C   s[   |  j    | d k r2 |  j d k r2 |  j   n% |  j d k rM | |  _ n  |  j   d S(   s5   Run a checkfriends, standalone or in loop mode, only.i    N(   R'  R2  R  R+  (   R   t
   retry_secs(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   checkfriends_mode  s    	
i   c         C   s  |  j  j d  r, |  j  d d  d k r, n> | d k rK |  j t j  n |  j d  } | d k rj d S|  j  d d  d k r d GHd S|  j  j d  d k r t j t j    } |  j |  n  | d	 k r|  j	 j
 d k rt j j   j   |  j	 _
 n  d } x_ | d k rj| d	 k r6|  j	 j   } n |  j   } | d k rd
 | GHt j |  qqW|  j d d  d k r| d k r|  j d |  j  d  q|  j d  n  d GHd S(   s   Post the text from stdin.R5   iRQ   R  i    Ns(   Error: Empty message body. No post made.R0   i   s   Waiting %d seconds to retry...R   Rm   Rg   s   Posted.(   R  R  R  R\   t   stdinR  R;  R  R>  R)  R   Ro  Rp  Rq  Rr  R  R*  R7  Rn  (   R   t
   draft_nameRs  Rf  Rp  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   quick_mode&  s8    )	c         C   s   | d k r d } n t  t j |   } | d k rH d | | f GHnj t | d k rv | d k rm d } qv d } n  | d k r d |  j t | <n y |  j t | =Wn n Xd S(   s$   Handle boolean command-line options.RQ   i   is,   Invalid value for command-line option %s: %si    Rg   N(   Ro   R{   RQ  R\  R  R[  (   R   t   knamet   svalR   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_bool_optT  s    			c         C   s  x| D]\ } } | d, k r; t  j j |  |  j d <q | d- k rc t  j j |  |  j d <q | d. k r | d	  |  j d
 <q | d/ k r t j | j    r | j   |  j d <qd GHq | d0 k r |  j |  q | d1 k r,|  j d d k r| d k r)|  j |  q)q|  j	 |  q | d2 k rH|  j
 |  q | d3 k r|y |  j |  Wqt k
 rxqXq | d4 k rt j |  |  j d <q | d5 k r| |  j d" <q | d6 k r|  j   q | d7 k r |  j | d* |  q q Wd+ S(8   s+   Handle second half of command-line options.s   -ds   --draftsR   s   -as	   --archiveR   s   -ss	   --subjecti   R7   s   -Ss   --socialR$   s1   Warning: invalid social bookmarks service option.s   -ms   --moods   -ks   --pics
   --keywordsR  R  RQ   s   -ts   --tags   --cats   -ps   --permits
   --securitys   -js	   --journalR8   s   -Ms   --musicR>   s   -As   --autodetects   --debugs   --autoformats
   --backdates
   --commentss	   --noemaili   N(   s   -ds   --drafts(   s   -as	   --archive(   s   -ss	   --subject(   s   -Ss   --social(   s   -ms   --mood(   s   -ks   --pics
   --keywords(   s   -ts   --tags   --cat(   s   -ps   --permits
   --security(   s   -js	   --journal(   s   -Ms   --music(   s   -As   --autodetect(   s   --debugs   --autoformats
   --backdates
   --commentss	   --noemail(   Rp   Rq   RR  R  RU  R  RQ  RT  RQ  R  R  RX  R   R{   Rh  Rm  (   R   t   optsR  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   set_cmd_optsm  sD    	c         C   s6   |  j  d d  |  j d <|  j  d d  |  j d <d S(   s0   Blogger cannot handle blank subjects or content.R7   s   (no subject)R5   s%   (this space intentionally left blank)N(   R7  R  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   sanitize_blog  s    c         C   s  |  j  j   } | d k r d S|  j  j g  k r: d GHd Sd GHHd } xB |  j  j D]4 } | d k  rp d | Gn d | G| GH| d } qS WHt d	  } Hy t |  } Wn t k
 r d } n X| d k  s | t |  j  j  k r d
 GHd Sd GH|  j  j | d |  j d <d S(   s   Select a category.i    Ns1   You currently do not have any categories defined.s   CATEGORY MENUi   i
   s   %d. s   %d.s   Enter category number: s   Invalid choice.s	   Selected.R@   (   R)  t   get_catsR   RV   R   R   Rz   R  (   R   Rp  R   Re   RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_category_menu  s6    
$c         C   s   |  j  |  t j d |  } |  j |  } | d k r> d Sy1 t |  j d d  } | j |  | j   Wn t k
 r d t	   GHn X|  j
 |  d S(   s   Common entry retrieval.s   %Y%m%d_%H%M%Si    Rm  R   s   Error writing to draft file: %si   (   R>  R;  R<  Rr  R   R  R   R   R   Ra   Rz  (   R   R  R  Rn  Rp  Rk   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_get_entry  s    c         C   s*  H| GHHd GH|  j    |  j d  |  j   |  j |  |  j   } | d& k rV d S| d' k ro |  j   n| d( k r |  j   n| d) k r |  j   n| d* k r |  j   nl| d+ k r |  j	   nS| d, k r |  j
   n:| d- k r8t d  } | d  |  j d <Ht |  d k r0d GHq&d GHn | d. k rQ|  j   n | d/ k ryt d  } |  j |  n | d0 k r|  j | d k  n | d1 k r| d k r|  j d"  } n |  j d"  } | d" k r&d Sn? | d2 k r!| d" k r!|  j d"  } | d" k r&d Sn d% GHd" S(3   s>   Common menu between regular posting and previous post editing.s   [e] Edit text of current post.t   categoryR  R   i    R   R  R   R  R  R[   R  R   R  Rk   R  R  R  R`   s	   Subject: i   R7   s6   Subject changed. WARNING: Truncated to 255 characters.s   Subject changed.R  R   R  RZ   s    Keyword tags (comma-separated): R  R   R  R  i   R	  R   s   That is not a valid option.(   R  R   (   R   R  (   R   R  (   R  R[   (   R  R   (   R  Rk   (   R  R  (   R  R`   (   R  R   (   R  RZ   (   R  R   (   R  R  (   R	  R   (   R  R  R  R  R=  R>  R9  Rg  R4  Ri  R2  RV   R  Rz   Rr  R  R<  Rt  Rx  Rz  (   R   R
  R  RU   R  R  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_common_menu  sb    

c         C   s   |  j  d d  S(   s   Atom/Metaweb posting menu.s   BLOG POSTING MENUi    (   Ru  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_post_menu  s    c         C   s   |  j  d d  S(   s   Atom/Metaweb editing menu.s   BLOG EDITING MENUi   (   Ru  (   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_edit_menu  s    c         C   sP  |  j  j   t |  j  j  } | d k r@ d GHt j d  n  | d k r |  j  j j   d } Hd | GH|  j  j | |  j  _ d SHd GHHd } |  j  j j   } x' | D] } d | | f GH| d } q WHt d  } Hy t	 |  } Wn t
 k
 rd } n X| d k  s%| t |  k r.d GHd S|  j  j | | d |  j  _ d S(	   s   Select a blog.i    s   
Charm could not retrieve any blogs for you. This may because of an
authentication error, or because you have not yet created a blog
on your blogging service.
i   s   Selected your only blog, '%s'.s   SELECT BLOGs   %d. %ss   Enter blog number: s0   Invalid choice. You need to choose a valid blog.(   R)  t	   get_blogsRz   R   R\   RX  RW   R   RV   R   R   (   R   t   nblogsRZ   R   RB  RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   blog_select_menu$  s>    	
c         C   s+  Hd GHd GH|  j    } | d k r0 |  j   n | d k rF t   n | d k r_ |  j   n | d k r d } x | r y |  j   } Wqt t k
 r |  j d  qt Xqt Wnu | d k r"|  j   |  j   |  j	 j
   } xC | ry |  j   } Wq t k
 r|  j d  q Xq Wn d GHd S(   s   Main Atom/MetaWeb menu.s   MAIN BLOGGING MENUsr   
[p] Post a blog entry.
[e] Edit or delete a posted blog entry.
[i] Information about the Charm client.
[q] Quit.
R   R  RW  R   R   R  R  R  i   R  R  R  RV  s   That is not a valid option.N(   R   R  (   RW  R   (   R   R  (   R  R  (   R  R  (   R=  R>  RP   R9  Rv  R  R@  R  Ru  R)  t   blog_pick_edit_menuRw  (   R   RU   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   blog_menuP  s6    
	

	c         C   s  |  j    | d k r> |  j |  d k r t j d  q n | d k rr |  j |  d k r t j d  q n` |  j j d  r |  j |  j d  d k r t j d  q n | d k r |  j | d  n  |  j |  | d k rd|  j	 j
   t |  j	 j  } | d k rd GHn6 |  j	 j |  j	 j j   d |  j	 _ |  j | d  t j d  n  t GHd GH|  j   x2 y |  j   Wq{t k
 r|  j d  q{Xq{d S(	   s<   Wrapper startup handler for Charm in Atom and MetaWeb modes.RQ   i    R/   i   sH   Error, could not automatically select blog since you have more than one.s   ( Fetching blogs... )t   mainN(   R@  R  R\   RX  R  R  R  R  Ro  R)  Rx  Rz   R   RW   R   Rj  t   Charm_HeaderRz  R|  R  R@  (   R   Rn  t	   resumeoldt	   xpostfileR  t	   quick_optRy  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt	   main_blogv  s:    
&
c         C   sY   y d d l  } Wn, t k
 r> d |  j d <d |  j d <d SX| j |  j d  } | S(   s/   MetaWebLog API XML-RPC interface server handle.iNR  R  s=   Your Python installation lacks the required xmlrpclib module.Ra   R+   (   R  R  R%  R  R  (   R   R  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_server  s    c         C   si  y- | j  j | |  j d |  j d  |  _ Wn d | t   f GHd SX|  j } | d |  j d <t j | d d  |  j d	 <| d
 |  j d <| j d  r | d d k r d | d | d f } n
 | d } | j d  r	| d d k r	| d |  j d <n  | j d  r%| d } n
 | d } t j	 t
 j t j t |  d    } |  j | |  S(   s   Get a post by post ID.R   R   s$   Error in retrieving post ID %s (%s).i    t   titleR7   t
   categoriesR   R@   t   mt_keywordsRA   t   mt_text_moreRQ   s   %s<!--more-->%st   descriptiont
   mt_excerptRB   t   date_created_gmtt   dateCreateds   %Y%m%dT%H:%M:%S(   t
   metaWeblogt   getPostR  R%  Ra   R{   R   R  R;  R  RD  t   timegmR  R_   Rs  (   R   R  t   postidRK  R  t   cdateR  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_get_post  s&    -	

*c         C   s   i |  j  d d 6|  j  d d 6} |  j  j d  rT t j |  j  d d  | d <n  |  j  j d  rz |  j  d | d	 <n  |  j  j d
  r |  j  d
 | d <n  | S(   s-   Prepare a data structure for MetaWeb content.R7   R  R5   R  R@   RP  R  RA   R  RB   R  (   R  R  R{   R   (   R   R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_prep_post  s     c         C   s  |  j    |  j   } |  j   } y= | j j |  j j d |  j d |  j d | d  |  _ Wn d t	   GHd SX|  j j
 d  r|  j } d GHd } x=| sy | j j | |  j d |  j d  |  _ y |  j j
 |  j d  r*t |  j d |  j |  j d |  j d	 |  j d
 f } n) t |  j d |  j d	 |  j d
 f } Wn d |  j d GHd SX|  j d c d | 7<d } Wq d t	   GHt d  } Ht j t j |   } | d k rd Sq Xq Wd } x | s~yE |  j   } | j j | |  j d |  j d | d  |  _ d } Wqd t	   GHt d  } Ht j t j |   } | d k r{d SqXqWn  d S(   s$   Send a post to a Metaweb-based blog.t   blogidR   R   i   s   Error in posting entry (%s).i    R$   s!   Posted. Adding social bookmark...t   linkR7   s   Malformed parameters for %s.R5   s   
s"   Error in retrieving new post (%s).s   Retry (Y/N)? Rc   Rb   s3   Error in modifying entry with social bookmark (%s).(   Rc   s   yes(   Rc   s   yes(   Rp  R  R  R  t   newPostR)  R   R  R%  Ra   R  R  R0  RU  RV   R{   RQ  RZ  t   editPost(   R   R   R  R  Rp  t   bookmarkRU   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_postevent  sZ    
=		)=-
	/
c         C   sz   |  j    |  j   } |  j   } y= | j j |  j j d |  j d |  j d | d  |  _ Wn d t	   GHd SXd S(   s   Edit an existing MetaWeb entry.Rs  R   R   i   s#   Error in posting edited entry (%s).i    (
   Rp  R  R  R  R  R)  R   R  R%  Ra   (   R   R   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_editevent  s    
=c         C   sk   |  j    } yD | j j |  j d |  j j d |  j d |  j d d  |  _ Wn d t   GHd SXd S(   s!   Delete an existing MetaWeb entry.R]  Rs  R   R   i   s#   Error in posting edited entry (%s).i    (   R  R  t
   deletePostR  R)  R   R%  Ra   (   R   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_delevent$  s    Dc         C   s   |  j    } y4 | j j |  j d |  j d |  j d  |  _ Wn d t   GHi  SXi  } x |  j D] } | | | d <qg W| |  j _ d S(   s   Get a list of MetaWeb blogs.R]  R   R   s   Error in retrieving blogs (%s).t   blogNameN(   R  R  t   getUsersBlogsR  R%  Ra   R)  R   (   R   R  t   blogst   bdict(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_get_blogs0  s    4c         C   s   |  j    } y7 | j j |  j j d |  j d |  j d  |  _ Wn d t   GHd SXg  } x" |  j D] } | j | d  qj W| |  j _	 d S(   s!   Get a list of MetaWeb categories.R  R   R   s$   Error in retrieving categories (%s).i    t   categoryNamei   (
   R  R  t   getCategoriesR)  R   R  R%  Ra   R   R   (   R   R  R   R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_get_cats@  s    7c      	   C   s  t  d  } Hy t |  } Wn t k
 r6 d } n X| d k  rL d GHd S|  j   } y: | j j |  j j d |  j d |  j d |  |  _	 Wn d t
   GHd SXd	 GHHd } x |  j	 D] } | d
 k  r d | Gn d | G| j d  r | d } n
 | d } d t j d t j t j t j t |  d     | d f GH| j d  rld | d GHn  | d } q WHt  d  } Hy t |  } Wn t k
 rd } n X| d k  s| t |  j	  k rd GHd Sd GH|  j	 | d } | d |  j j d <|  j | | d  S(   s<   Choose number of blog posts to retrieve, get list, pick one.s)   Enter the number of entries to retrieve: i    i   s#   You must enter a reasonable number.R  R   R   s   Error in retrieving posts (%s).s   SELECT RECENT POST TO EDITi
   s   %d. s   %d.R  R  s   %s %ss   %Y-%m-%d %H:%M:%Ss   %Y%m%dT%H:%M:%SR  R  s       %ss   Enter entry number: s   Invalid choice.s   Selected. Retrieving...R  Rs  (   RV   R   R   R  R  t   getRecentPostsR)  R   R  R%  Ra   R  R;  R<  R  RD  R  R  R_   Rz   R  (   R   RU   Ri   R  R   R  R  RK  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   metaweb_pick_edit_menuQ  sV    
:
C
!c         C   s   t    |  _ |  j |  j _ |  j |  j _ |  j |  j _ |  j |  j _	 |  j
 |  j _ |  j |  j _ |  j | | | | |  d S(   s6   This is the startup handler for Charm in Metaweb mode.N(   R   R)  R  Rx  R  Rq  R  R{  R  Rr  R  Ru  R  Ry  R  (   R   Rn  R  R  R  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt
   do_metaweb  s    c         C   sf  i d d 6|  j  d d 6} |  j  d d k r d |  j  d | d	 <y t j |  j  d  } Wquy t j |  j  d  } Wq d
 t   GHd SXquXn t j d t j    } t |  } t	 j
 t j d | | |  j  d f  j    d  }	 d | d	 <d |  j  d |	 | | f | d <y t j |  j  d  } Wn8 y t j |  j  d  } Wqud
 t   GHd SXn Xy& | j | | | |  | j   }
 Wn d t   GHd SX|
 j d k rd GHd S|
 j d k rd GHd S|
 j d k rd GHd S|
 j d k rd GHd Sy@ |
 j   } | d k rEt j |  |  j _ n | |  j _ Wn d GHd SXd S(   s   Generic request and response.s   application/xmls   Content-typeR+   t   HostR_  i   s   BASIC %sR   t   Authorizations/   Failed, connection error (%s). Try again later.i    s   %Y-%m-%dT%H:%M:%SZs   %s%s%sis   WSSE profile="UsernameToken"sJ   UsernameToken Username="%s", PasswordDigest="%s", Created="%s", Nonce="%s"R   s   X-WSSEs+   Failed, server error (%s). Try again later.i  sE   Failed, authorization error. Please check your username and password.i  s5   Failed, no such URL. Please check your configuration.i  s0   Failed, format error. Please edit and try again.i  s>   Failed, bad request. This may be the result of a bug in Charm.s%   Failed, parse error. Try again later.(   R  t   httplibt   HTTPSConnectiont   HTTPConnectionRa   R;  R<  t   gmtimeR   RF  RG  R   R   R   t   requestt   getresponset   statust   readt
   feedparsert   parseR)  R   (   R   t   methodt   resourcet   contentt   rawt   headerst   connR   t   noncet   pdigestt   responset   rtext(    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_request  sh    
6
!	c      
   C   s   |  j    |  j j d  r6 d } d |  j d } n d } d } d | t |  j d  | t |  j j  t t  t |  j d  t |  j d  f } |  j d	 |  j j d
 |  } | S(   s"   Send a post to an Atom-based blog.R@   s,    xmlns:dc="http://purl.org/dc/elements/1.1/"s   
   <dc:subject>%s</dc:subject>RQ   sO  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry xmlns="http://purl.org/atom/ns#"%s>
   <title mode="escaped" type="text/plain">%s</title>%s
   <issued>%s</issued>
   <generator url="%s">%s</generator>
   <content type="application/xhtml+xml">
   <div xmlns="http://www.w3.org/1999/xhtml">%s</div>
   </content>
</entry>
R7   R
  R5   t   POSTt   post(	   Rp  R  R  R   R)  R   t
   Client_URLR  R   (   R   t   tagelemt   tagdataR  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_postevent  s    
Xc         C   su   d t  |  j d  t  |  j j  t  t  t  |  j d  t  |  j d  f } |  j d |  j j d |  } | S(   s   Edit an existing Atom post.sj  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry xmlns="http://purl.org/atom/ns#">
  <title mode="escaped" type="text/html">%s</title>
  <issued>%s</issued>
  <generator url="%s">%s</generator>
  <content type="application/xhtml+xml" xml:lang="en-US" xml:space="preserve">
  <div xmlns="http://www.w3.org/1999/xhtml">%s</div>
  </content>
</entry>
R7   R
  R5   t   PUTRs  (   R   R  R)  R   R  R  R   (   R   R  Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_editevent  s    Rc         C   s    |  j  d |  j j d  } | S(   s   Delete an existing Atom post.t   DELETERs  (   R  R)  R   (   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_delevent  s    c         C   s&   d GHH|  j  d |  j j d  } | S(   s   Get a list of recent entries.s   Retrieving recent posts...t   GETt   feed(   R  R)  R   (   R   Rp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_get_recent  s    c         C   s  d GHH|  j  d |  j j d  } | d k r2 d S|  j j j d } | d |  j _ | d |  j d <| d d d	 } x= | d
  d k r | d d k r | d
 d !} | j   } q{ W| j d  r | d |  j d <n  t	 j
 t j | d   } |  j | |  S(   s   Get a single entry via Atom.s   Retrieving entry...R  Rs  i    t   issuedR  R7   R  t   valuei   s   <div>is   </div>Rt  R@   t   issued_parsed(   R  R)  R   R   RJ  R   R  RZ  R  R;  R  RD  R  Rs  (   R   Rp  RK  R  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_get_entry   s     #c         C   s   |  j  j j d  s d GHd S|  j d |  j  j d d d  d k rJ d Sg  } xf |  j  j j d  D]O } y? | j d  d } | d	 k r | d
 k r | j |  n  Wqf qf Xqf W| j   | |  j  _	 d S(   s   Get a list of categories.t   catss0   Sorry, your blog does not have category support.i    R  i   s
   </subject>t   >iRQ   s   
N(
   R)  R   R  R  R^   R   R   R   Ri  R   (   R   R   R   Re   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_get_cats<  s     (
c         C   s/  |  j  d |  j d  d k r# d Si  } x |  j j j d D] } | d } | j |  d k ro i  | | <n  d d j | d	 d
 j d  d  } | d d k r | | | d <q= | d d k r | | | d <q= | d d k r | | | d <q= | d d k r= | | | d <q= q= W| |  j _ d S(   s   Get a list of the Atom feeds.R  R^  i    Nt   linksR  s   /%sR	  t   hrefi   i   t   rels   service.feedR  s   service.postR  s   service.uploadt   uploads   service.categoriesR  (	   R  R  R)  R   R  R  R   R   R   (   R   R  R  R  R   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_get_blogsW  s$    
(c   	      C   s  |  j    } | d k r d Sg  } x |  j j j D] } xM | d D]A } | d d k rC d d j | d d j d  d	  } qC qC W| j t j d
 t j	 t
 j | j    | j | f  q2 Wd GHHd	 } xN | D]F } | d k  r d | Gn d | Gd | d | d	 f GH| d	 } q WHt d  } Hy t |  } Wn t k
 rZd } n X| d	 k  sy| t |  k rd GHd Sd GH| | d	 d |  j j d <|  j   d	 S(   s+   Get list of recent blog posts and pick one.i    R  R  s   service.edits   /%sR	  R  i   i   s   %Y-%m-%d %H:%M:%Ss   SELECT RECENT POST TO EDITi
   s   %d. s   %d.s   %s %ss   Enter entry number: s   Invalid choice.s	   Selected.i   Rs  (   R  R)  R   RJ  R   R   R   R;  R<  R  RD  R  R  R  RV   R   R   Rz   R   R  (	   R   Rp  t   entsR  R   R  R   RU   Ri   (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   atom_pick_edit_menup  s@    />

c         C   s   t  d k r! d GHt j d  n  t   |  _ |  j |  j _ |  j |  j _ |  j	 |  j _
 |  j |  j _ |  j |  j _ |  j |  j _ |  j | | | | |  d S(   sA   This is the startup handler for Charm in Atom API (blogger) mode.i    s   
Your Charm installation does not currently support the Atom API.
To support blogging via the Atom API, Charm requires the feedparser module.
N(   RT  R\   RX  R   R)  R  Rx  R  Rq  R  R{  R  Rr  R  Ru  R  Ry  R  (   R   Rn  R  R  R  R  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   do_atom  s    N(   R   R   R   R   R7  R8  R9  R^   R:  R>  R@  RC  RN  RV  RY  Rh  Rk  Rr  Ru  Rv  Rz  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R!  R"  R#  R$  R'  R(  R+  R2  R4  R<  R=  R>  R@  RO  RQ  RT  RX  R\  R]  Rg  Ri  Rn  Rt  Rx  Rz  R|  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R   R"  R$  R'  R+  R,  R-  R.  R0  R3  R<  RG  R?  RT  RU  R\  R  Rc  Re  Rg  Rj  Rm  Ro  Rp  Rr  Rs  Ru  Rv  Rw  Rz  R|  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR  }  sD  	L				 
	
	
			 	D						*		$		 #3			7			2		N										$									7		R		
		W			$	@		,	J7B	&&O	#			>		5		?		Y					 	|*	D					K			"	
	&			"	/	%			(	,			9	$	 	+				Q	k		-	.		,		'	=			,	&	.				;					;	D				
				-c           C   s   d t  j d GHd GHd  S(   Ns   
Usage: %s [options]i    s0  
Options:

  -h, --help                  Print this usage message.
  -o, --options               Print additional posting options.

  -f, --file FILENAME         Use this file as your .charmrc
  -u, --user USERNAME         Use this as your initial username.
  -l, --login                 Log in automatically.
  -n, --nologin               Don't log in automatically.
  -d, --drafts DIR            Save drafts in this directory.
  -a, --archive DIR           Archive old posts in this directory.
  -r, --resume DRAFTFILE      Resume working on a previous draft.
  -T, --template TEMPLATE     Read in a post template.
  -q, --quick                 Quick posting mode.
  -x, --xpost ARCHIVEFILE     Crosspost an existing post, as another user.
  -z, --sync                  Synchronize journal mode.
  -c, --check                 Check for friend updates only.
  -i, --interval MINUTES      Check for friend updates this often.
  -g, --group FRIENDGROUP     Check only this friend group for updates. You
                              can specify this option multiple times.
(   R\   R~  (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   usage  s    c           C   s   d t  j d GHd GHd  S(   Ns   
Usage: %s [options]i    s  
Options:

  -h, --help               Print main usage message and command-line options.
  -o, --options            Print these additional posting options. They all
                           specify an attribute for your next post.

LiveJournal only:

  -s, --subject "SUBJECT"  Specify subject.
  -j, --journal JOURNAL    Specify journal to post to.
  -p, --permit PERMISSION  Specify security permission: friends, private, etc.
  -m, --mood MOOD          Specify mood.
  -k, --pic KEYWORD        Specify picture keyword.
  -t, --tag TAG            Specify a tag.
  -M, --music "MUSIC"      Specify music.
  -A, --autodetect         Autodetect music using XMMS.
  --autoformat=[on|off]    Format your post yourself? Set this to off.
  --backdate=[on|off]      Backdate your post?
  --comments=[on|off]      Allow others to comment on this post?
  --noemail=[on|off]       Don't want comments emailed to you? Set this to off.

Non-LiveJournal only:

  -s, --subject "SUBJECT"  Specify subject.
  -k, --keywords KEYWORD   Specify tag keywords.
  -t, --tag, --cat TAG     Specify a category "tag".
  -S, --social SERVICE     Autogenerate social bookmark.
(   R\   R~  (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   postopt_usage  s    c       !   C   s  d }  d d d d d d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" g! } y& t  j  t j d# |  |  \ } } Wn( t  j k
 r t   t j d#  n Xt   } | d$ d% } d& } d& } d' } d' }	 d( }
 d& } d& } d' } d' } g  } x| D]\ } } | dS k rIt   t j d&  q| dT k rlt   t j d&  q| dU k rt j	 j
 |  } q| dV k r| } q| dW k rd# }
 q| dX k rd& }
 q| dY k rd# } q| dZ k rd# } q| d[ k rd# } q| d\ k rWy) t |  d= } | d= k  r?d& } n  Wqt k
 rSqXq| d] k r|| j t j |   q| d^ k r| }	 q| d_ k r| } q| d` k r| } qqWt   } | j |  | d' k r| j |  } n7 | j j dF  r| j | j dF  } n | j   } | d& k rFt j d#  n  | j dG dH k r| j | | | |	 |  t j d&  n  | j dG dI k r| j | | | |	 |  t j d&  n  | d& k s| g  k r| j j dJ | | j dK  n  | d# k rA| j |  | j   | j j | j dK  t j d&  n  | g  k rY| | _ n  | d# k r| j |  t j d&  n  |
 d( k r| j d
 dL  dM k rd& }
 qd# }
 n  | d& k r|
 d# k rdN GHn  t GHn  |
 d# k r| j  |  | d& k rHt! GHqn  y | j" | j dO  Wn& t# k
 r<n t k
 rQdP GHn X| j$   | d' k r| j% |  d& k r$t j d&  q$n |	 d' k r| j& |	  d& k r$t j d&  q$n` | j j dQ  r| j& | j dQ  d& k r$t j d&  q$n | d' k r$| j' | d#  n  | j |  | d# k rZ| j( |  t j d&  n  x2 y | j)   Wq]t* k
 r| j+ dR  q]Xq]d  S(a   Ns+   hoDAf:u:clnqzs:m:k:t:p:M:j:d:a:r:x:i:g:S:T:t   helpt   optionsR   R   s   file=s   user=t   checkR   R   t   quickt   syncs   subject=s   mood=s   pic=s   cat=s   tag=s	   keywords=s   music=s   journal=s   permit=s	   security=s   drafts=s   archive=s   resume=s   xpost=s	   interval=s   group=s   autoformat=s	   backdate=s	   comments=s   noemail=s   social=s	   template=i   R	  s   .charmrci    RQ   is   -hs   --helps   -os	   --optionss   -fs   --files   -us   --users   -ls   --logins   -ns	   --nologins   -cs   --checks   -qs   --quicks   -zs   --syncs   -is
   --intervali<   s   -gs   --groups   -Ts
   --templates   -rs   --resumes   -xs   --xpostR#   R  R`  R"   s   %s/.charmcacheR   Rm   Rg   s   ( Logging in... )R)   s+   Warning: invalid value for security option.R/   R}  (   s   -hs   --help(   s   -os	   --options(   s   -fs   --file(   s   -us   --user(   s   -ls   --login(   s   -ns	   --nologin(   s   -cs   --check(   s   -qs   --quick(   s   -zs   --sync(   s   -is
   --interval(   s   -gs   --group(   s   -Ts
   --template(   s   -rs   --resume(   s   -xs   --xpost(,   t   getoptR\   R~  t   GetoptErrorR  RX  R   R  Rp   Rq   RR  R   R   R   R{   RQ  R  RY  Re  R  R  R  R  R   R   Ro  R?  R   R3  Rg  R7  R~  R  RM   RX  R   R@  R  R  R  Rj  R\  R  R@  (   t
   short_optst	   long_optsRn  R   R   t   rc_fileR  t   sync_optR  R  t	   login_optt   ckfronlyt	   ckfrdelayR  Rd  t
   ckfrgroupsR  R  t   jobjRp  (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyR}    s   	&										
			

(:   R\   Rp   t   os.pathR{   R  R;  R   R  R   R   RD  R  R  RF  Ro  R   RT  t   xmms.controlRa  RO   R   t
   __author__RN   R  RM   R~  RU  R\  R[  R]  Rt  R?  R   RP   RV   RX   Ra   Ro   Rx   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R  R  R  R}  (    (    (    s1   /afs/athena.mit.edu/user/x/a/xavid/bin/ljcharm.pyt   <module>!   s  




		
															/                     M		!