Merge branch 'master' of github.com:modgethanc/ttbp
commit
8967cf289d
185
README.html
185
README.html
|
@ -1,53 +1,74 @@
|
|||
<p><em>a command-line based blogging platform running on tilde.town</em></p>
|
||||
<p><code>ttbp</code> stands for "tilde.town blogging platform", the original working name for
|
||||
|
||||
<p><code>ttbp</code> stands for “tilde.town blogging platform”, the original working name for
|
||||
this project.</p>
|
||||
<p><img alt="ttbp main menu screenshot" src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-main.png" /></p>
|
||||
<p><img alt="ttbp entries view screenshot" src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-entries.png" /></p>
|
||||
<p><img alt="ttbp compose view screenshot" src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-compose.png" /></p>
|
||||
|
||||
<p><img src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-main.png" alt="ttbp main menu screenshot" /></p>
|
||||
|
||||
<p><img src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-entries.png" alt="ttbp entries view screenshot" /></p>
|
||||
|
||||
<p><img src="http://tilde.town/~endorphant/ttbp/screenshots/ttbp-compose.png" alt="ttbp compose view screenshot" /></p>
|
||||
|
||||
<p><code>ttbp</code> runs from the command line, providing a hub for writing personal blog
|
||||
posts and reading posts written by other users of tilde.town. it's a little bit
|
||||
posts and reading posts written by other users of tilde.town. it’s a little bit
|
||||
like livejournal or dreamwidth or tumblr. you can opt to publish your posts to a
|
||||
public html file hosted on your tilde page, to tilde.town's gopher server, or
|
||||
public html file hosted on your tilde page, to tilde.town’s gopher server, or
|
||||
keep all your entries private to the tilde.town server.</p>
|
||||
|
||||
<p>to use, run <code>feels</code> while logged in to tilde.town</p>
|
||||
|
||||
<p>this is a project that runs on tilde.town, so all users of this program are
|
||||
expected to operate under the tilde.town <a href="http://tilde.town/wiki/conduct.html">code of
|
||||
conduct</a>. content/personal issues should be
|
||||
worked out according to the CoC, with support from the <a href="http://tilde.town/wiki/administration/index.html">administrative
|
||||
team</a> if needed.</p>
|
||||
|
||||
<h3>QUICK START</h3>
|
||||
|
||||
<p>no coding or html experience is necessary to get started. just log in to your
|
||||
tilde.town account and enter:</p>
|
||||
|
||||
<p><code>feels</code></p>
|
||||
|
||||
<p>ttbp will ask you a few questions to get you started. after that, writing and
|
||||
reading entries all happen within the program.</p>
|
||||
<p>that's it!</p>
|
||||
|
||||
<p>that’s it!</p>
|
||||
|
||||
<h3>support</h3>
|
||||
<p>if you're having trouble getting started, or run into program errors or strange
|
||||
behavior, please send internal tilde.town mail to ~endorphant and i'll try to
|
||||
|
||||
<p>if you’re having trouble getting started, or run into program errors or strange
|
||||
behavior, please send internal tilde.town mail to ~endorphant and i’ll try to
|
||||
sort things out!</p>
|
||||
<p>there's also a function from the main menu that lets you send feedback/inquiries
|
||||
to me directly; this uses internal tilde.town mail, which is what i'll respond
|
||||
|
||||
<p>there’s also a function from the main menu that lets you send feedback/inquiries
|
||||
to me directly; this uses internal tilde.town mail, which is what i’ll respond
|
||||
to.</p>
|
||||
|
||||
<h3>writing entries</h3>
|
||||
|
||||
<p>entries are recorded as plaintext files in your <code>~/.ttbp/entries</code> directory.
|
||||
<code>ttbp</code> will use your selected editor to open and write files; each day is its
|
||||
own entry, like a diary page. at midnight for whatever timezone you've set for
|
||||
your user account on tilde.town, you'll get a fresh entry. if you don't write
|
||||
own entry, like a diary page. at midnight for whatever timezone you’ve set for
|
||||
your user account on tilde.town, you’ll get a fresh entry. if you don’t write
|
||||
any feels on a particular day, no entries will show up there.</p>
|
||||
|
||||
<p>when you save and quit the text editor, your entry will automatically propagate
|
||||
to the global feels list; if you've opted to publish your feels to html/gopher,
|
||||
those files will update immediately. you can always go back to the current day's
|
||||
entry and edit/add as you'd like, but older entries will not be available for
|
||||
to the global feels list; if you’ve opted to publish your feels to html/gopher,
|
||||
those files will update immediately. you can always go back to the current day’s
|
||||
entry and edit/add as you’d like, but older entries will not be available for
|
||||
editing from <code>ttbp</code>.</p>
|
||||
<p><em>(since files are just stored as plaintext in your directory, it's possible to
|
||||
|
||||
<p><em>(since files are just stored as plaintext in your directory, it’s possible to
|
||||
edit and move old entries directly from the command line. however, changing old
|
||||
entries might cause strange things to happen with timestamps. the main program
|
||||
looks at the filename first for setting the date, then the last modified time to
|
||||
sort recent posts. it expects YYYMMDD.txt as the filename; anything else won't
|
||||
sort recent posts. it expects YYYMMDD.txt as the filename; anything else won’t
|
||||
show up as a valid entry. yes, this means you can post things out of date order
|
||||
by creating files with any date you want.)</em></p>
|
||||
|
||||
<h4>general entry-writing notes</h4>
|
||||
|
||||
<ul>
|
||||
<li>you can use <a href="https://daringfireball.net/projects/markdown/syntax">markdown</a></li>
|
||||
<li>you can use html</li>
|
||||
|
@ -55,150 +76,212 @@ by creating files with any date you want.)</em></p>
|
|||
in the feed but not render in a browser (but people can still read
|
||||
them with view-source)</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>reading other feels</h3>
|
||||
|
||||
<p>the <code>browse global feels</code> feature shows the ten most recent entries that anyone
|
||||
has written on ttbp. this list is only accessible from within tilde.town,
|
||||
although individual entries may be posted to html or gopher.</p>
|
||||
<p>you can also pull up a list of a single user's feels through <code>check out your
|
||||
|
||||
<p>you can also pull up a list of a single user’s feels through <code>check out your
|
||||
neighbors</code>, which displays all users who are writing on <code>ttbp</code> based on their
|
||||
most recently updated entry, and a link to their public html blog if they've
|
||||
most recently updated entry, and a link to their public html blog if they’ve
|
||||
opted to publish their posts.</p>
|
||||
|
||||
<p><strong>please note!</strong> entries written on <code>ttbp</code> should be considered sensitive,
|
||||
private information, even if a particular user is publishing entries in a
|
||||
world-viewable way! please be respectful about having access to other people's
|
||||
world-viewable way! please be respectful about having access to other people’s
|
||||
feels, and do not copy/repeat any information without getting their explicit
|
||||
permission. tilde.town operates on a high level of mutual trust, and <code>ttbp</code> is
|
||||
designed to give individuals control over their content.</p>
|
||||
|
||||
<h3>subscribing to users</h3>
|
||||
|
||||
<p>the <code>visit your subscriptions</code> feature lets you view recent entries from a list
|
||||
of users you’ve subscribed to, as well as manage your subscription list. your
|
||||
list is saved to <code>~/.ttbp/config/subs</code>, which gets automatically updated when
|
||||
you add or remove subscriptions from ttbp.</p>
|
||||
|
||||
<p>your subscription list is private; this means no one other than you can see who
|
||||
you’re following. subscription view only shows the 50 most recent entries from
|
||||
your subscribe list; if you want to see more entries from an individual, you
|
||||
can navigate to their entries in `check out your neighbors from the main
|
||||
menu.</p>
|
||||
|
||||
<h3>privacy</h3>
|
||||
|
||||
<p>when you start your ttbp, you have the option of publishing or not publishing
|
||||
your blog.</p>
|
||||
|
||||
<p>if you opt to not publish, your entires will never be accessible from outside of
|
||||
the tilde.town network; other tilde.town users will still be able to read your
|
||||
entries through the ttbp interface, or by directly accessing your
|
||||
<code>~/.ttbp/entries</code> directory.</p>
|
||||
|
||||
<p>if you want to further protect your entries, you can <code>chmod 700</code> your entries
|
||||
directory.</p>
|
||||
|
||||
<p>if you opt to publish, the program creates a directory <code>~/.ttbp/www</code> where it
|
||||
stores all html files it generates, and symlinks this from your <code>~/public_html</code>
|
||||
with your chosen blog directory. your blog will also be listed on the <a href="https://tilde.town/~endorphant/ttbp">main ttbp
|
||||
page</a>.</p>
|
||||
|
||||
<p>you can also opt to publish to gopher, and the program will automatically
|
||||
generate a gophermap of your feels.</p>
|
||||
|
||||
<p>you can set publishing status on individual entries, or bury individual feels;
|
||||
see "data management" below for details.</p>
|
||||
see “data management” below for details.</p>
|
||||
|
||||
<h3>data management</h3>
|
||||
|
||||
<p>the <code>manage your feels</code> menu provides several tools for organizing your feels.
|
||||
these are all actions you can perform manually from the command line, but doing
|
||||
them from within the program can help keep your files properly linked up.</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>read over feels</strong>--a list of all your entries, which you can open and
|
||||
<li><strong>read over feels</strong>–a list of all your entries, which you can open and
|
||||
read like any other feel</li>
|
||||
<li><strong>modify feels publishing</strong>--this lets you toggle privacy on individual
|
||||
<li><strong>modify feels publishing</strong>–this lets you toggle privacy on individual
|
||||
posts. entries marked <code>(nopub)</code> will not get written to html or gopher,
|
||||
and toggling them from this menu will immediately publish or unpublish
|
||||
that entry (if you're not publishing your posts at all, these settings
|
||||
won't matter, since your feels will never show up outside of tilde.town)</li>
|
||||
<li><strong>backup your feels</strong>--makes a .tar.gz of all your entries, saving one
|
||||
that entry (if you’re not publishing your posts at all, these settings
|
||||
won’t matter, since your feels will never show up outside of tilde.town)</li>
|
||||
<li><strong>backup your feels</strong>–makes a .tar.gz of all your entries, saving one
|
||||
copy to <code>~/.ttbp/backups/</code> with the current date, and a second copy to
|
||||
your home directory for safekeeping.</li>
|
||||
<li><strong>import a feels backup</strong>--unpacks a backup file into your current feels
|
||||
<li><strong>import a feels backup</strong>–unpacks a backup file into your current feels
|
||||
list. this tool checks the <code>~/.ttbp/backups</code> directory for archives, and
|
||||
expects a file created by the above backup utility. if it detects any file
|
||||
collisions, it will preserve your current live copy and leave the backup
|
||||
verison in a temp directory, and notify you that this happened. also, any
|
||||
entries that were previously marked as <code>(nopub)</code> will retain their nopub
|
||||
status.</li>
|
||||
<li><strong>bury some feels</strong>--hides individual feels from viewing; entries are
|
||||
<li><strong>bury some feels</strong>–hides individual feels from viewing; entries are
|
||||
moved to <code>~/.ttbp/buried</code> (and marked with a unique timestamp to prevent
|
||||
file collision) with permissions set to 600, meaning no one except you
|
||||
will be able to open that file. these entries are also hidden from your
|
||||
own view from <code>read over feels</code>, and you'll have to open the files from
|
||||
own view from <code>read over feels</code>, and you’ll have to open the files from
|
||||
the command line if you want to see them. this is intended to be a
|
||||
permament action, so you'll be asked to type the entry date once to load
|
||||
permament action, so you’ll be asked to type the entry date once to load
|
||||
the feel, then shown a preview of that feel, and then type the date again
|
||||
to confirm burying.</li>
|
||||
<li><strong>delete feels by day</strong>--<em>permanently removes individual entries</em>,
|
||||
<li><strong>delete feels by day</strong>–<em>permanently removes individual entries</em>,
|
||||
including deleting published html/gopher files if needed. this action is
|
||||
not recoverable, unless you have a backup to restore; you'll be asked to
|
||||
not recoverable, unless you have a backup to restore; you’ll be asked to
|
||||
type the entry date once to load the feel, then shown a preview of that
|
||||
feel, and then type the date again to confirm deletion.</li>
|
||||
<li><strong>purge all feels</strong>--<em>permanently removes all feels</em>, including deleting
|
||||
<li><strong>purge all feels</strong>–<em>permanently removes all feels</em>, including deleting
|
||||
all published html/gopher files if needed. this action is not recoverable,
|
||||
unless you have a backup to restore. you'll be asked to type a
|
||||
unless you have a backup to restore. you’ll be asked to type a
|
||||
one-time-use purge code to confirm this action.</li>
|
||||
<li><strong>wipe feels account</strong>--<em>permanently removes all data associated with
|
||||
<li><strong>wipe feels account</strong>–<em>permanently removes all data associated with
|
||||
feels</em>, including deleting any published hmtl/gopher files and removing
|
||||
your <code>~/.ttbp</code> directory. any backups that you have in <code>~/.ttbp/backups</code>
|
||||
will also be deleted with this action (which is why the backup function
|
||||
makes a second copy for safekeeping in your home directory). you will no
|
||||
longer show up in any lists as a user.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>settings</h3>
|
||||
|
||||
<p>the settings menu lets you change specific options for handling your feels and
|
||||
using the interface.</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>editor</strong>--set your text editor</li>
|
||||
<li><strong>gopher</strong>--opt in or out of automatically posting to gopher</li>
|
||||
<li><strong>post as nopub</strong>--set whether posts default to being published or not
|
||||
published (if you're not publishing your feels, this doesn't matter)</li>
|
||||
<li><strong>publish dir</strong>--set the directory under you <code>public_html</code> where feels will be
|
||||
published (if you're not publishing your feels, this defaults to <code>None</code>)</li>
|
||||
<li><strong>publishing</strong>--opt in or out of automatically publishing entries to a
|
||||
<li><strong>editor</strong>–set your text editor</li>
|
||||
<li><strong>gopher</strong>–opt in or out of automatically posting to gopher</li>
|
||||
<li><strong>post as nopub</strong>–set whether posts default to being published or not
|
||||
published (if you’re not publishing your feels, this doesn’t matter)</li>
|
||||
<li><strong>publish dir</strong>–set the directory under you <code>public_html</code> where feels will be
|
||||
published (if you’re not publishing your feels, this defaults to <code>None</code>)</li>
|
||||
<li><strong>publishing</strong>–opt in or out of automatically publishing entries to a
|
||||
world-readable html page</li>
|
||||
<li><strong>rainbows</strong>--opt in or out of having multicolored menu text</li>
|
||||
<li><strong>rainbows</strong>–opt in or out of having multicolored menu text</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>changing your page layout</h3>
|
||||
|
||||
<p>you can modify how your blog looks by editing the stylesheet or header and
|
||||
footer files. the program sets you up with basic default. if you break your page
|
||||
somehow, you can force the program to regenerate your configuration by deleting
|
||||
your ~/.ttbp directory entirely. <strong>you might want to back up your
|
||||
~/.ttbp/entries directory before you do this.</strong></p>
|
||||
|
||||
<ul>
|
||||
<li>to modify your stylesheet, edit your ~/.ttbp/config/style.css</li>
|
||||
<li>to modify the page header, edit your ~/.ttbp/config/header.txt</li>
|
||||
<li>there's a place marked off in the default header where you can safely put
|
||||
<li>to modify the page header, edit your ~/.ttbp/config/header.txt
|
||||
|
||||
<ul>
|
||||
<li>there’s a place marked off in the default header where you can safely put
|
||||
custom HTML elements!</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>to modify the page footer, edit your ~/.ttbp/config/footer.txt</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>general tips/troubleshooting</h3>
|
||||
|
||||
<ul>
|
||||
<li>if the date looks like it's ahead or behind, it's because you haven't set
|
||||
<li>if the date looks like it’s ahead or behind, it’s because you haven’t set
|
||||
your local timezone yet. here are some
|
||||
<a href="http://www.cyberciti.biz/faq/linux-unix-set-tz-environment-variable/">timezone setting instructions</a></li>
|
||||
<li>the feels burying tool will effectively clear your post for the day; you can
|
||||
use this feature to start a fresh entry on a particular day by burying the
|
||||
current day's feels and then editing a new file</li>
|
||||
current day’s feels and then editing a new file</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>future features</h3>
|
||||
|
||||
<p>these are a few ideas being kicked around, or under active development:</p>
|
||||
|
||||
<ul>
|
||||
<li>stylesheet/theme selector</li>
|
||||
<li>better entry display within ttbp (currently just offloads to <code>less</code>)</li>
|
||||
<li>buried feels browser</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<p>other ideas are listed on github as
|
||||
<a href="https://github.com/modgethanc/ttbp/issues?q=is%3Aissue+is%3Aopen+label%3A" title="upcoming+features">upcoming features</a> or <a href="https://github.com/modgethanc/ttbp/issues?q=is%3Aissue+is%3Aopen+label%3A" title="feature+request">feature requests</a>!</p>
|
||||
|
||||
<h3>dependencies</h3>
|
||||
|
||||
<p>(this section is only relevant if you plan on forking the repo and running an
|
||||
instance of this yourself)</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://pypi.python.org/pypi/mistune">mistune</a></li>
|
||||
<li><a href="https://pypi.python.org/pypi/inflect">inflect</a></li>
|
||||
<li><a href="https://pypi.python.org/pypi/six">six</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>contributing</h3>
|
||||
|
||||
<p>please check out my <a href="https://github.com/modgethanc/ttbp/blob/master/.github/CONTRIBUTING.md">contributor
|
||||
guidelines</a>
|
||||
on github if you'd like to get involved with development!</p>
|
||||
on github if you’d like to get involved with development!</p>
|
||||
|
||||
<p>if you find any bugs or strange behavior, please message me locally on tildemail
|
||||
or open a github issue and i'll get back to you as soon as i can.</p>
|
||||
<p>if you're interested in helping with the code, please drop me some tildemail!</p>
|
||||
or open a github issue and i’ll get back to you as soon as i can.</p>
|
||||
|
||||
<p>if you’re interested in helping with the code, please drop me some tildemail!</p>
|
||||
|
||||
<p>i accept tips for development work on
|
||||
<a href="https://liberapay.com/modgethanc">liberapay</a></p>
|
||||
|
||||
<h3>contributor shout-outs</h3>
|
||||
|
||||
<p>thanks to:</p>
|
||||
|
||||
<ul>
|
||||
<li>~vilmibm, packaging help and gopher support</li>
|
||||
<li>~sanqui, the bug swatter</li>
|
||||
<li>~sinacutie, for css updates</li>
|
||||
</ul>
|
||||
|
||||
|
|
13
README.md
13
README.md
|
@ -94,6 +94,19 @@ feels, and do not copy/repeat any information without getting their explicit
|
|||
permission. tilde.town operates on a high level of mutual trust, and `ttbp` is
|
||||
designed to give individuals control over their content.
|
||||
|
||||
### subscribing to users
|
||||
|
||||
the `visit your subscriptions` feature lets you view recent entries from a list
|
||||
of users you've subscribed to, as well as manage your subscription list. your
|
||||
list is saved to `~/.ttbp/config/subs`, which gets automatically updated when
|
||||
you add or remove subscriptions from ttbp.
|
||||
|
||||
your subscription list is private; this means no one other than you can see who
|
||||
you're following. subscription view only shows the 50 most recent entries from
|
||||
your subscribe list; if you want to see more entries from an individual, you
|
||||
can navigate to their entries in `check out your neighbors from the main
|
||||
menu.
|
||||
|
||||
### privacy
|
||||
|
||||
when you start your ttbp, you have the option of publishing or not publishing
|
||||
|
|
|
@ -76,6 +76,7 @@ MAIN_FEELS = os.path.join(PATH, 'entries')
|
|||
BURIED_FEELS = os.path.join(PATH, 'buried')
|
||||
NOPUB = os.path.join(USER_CONFIG, 'nopub')
|
||||
BACKUPS = os.path.join(PATH, 'backups')
|
||||
SUBS = os.path.join(USER_CONFIG, 'subs')
|
||||
|
||||
## UI
|
||||
|
||||
|
@ -86,7 +87,7 @@ ___________________________________________________________
|
|||
| ____ ____ ____ _ ____ ____ _ _ ____ _ _ _ ____ |
|
||||
| |___ |___ |___ | [__ |___ |\ | | __ | |\ | |___ |
|
||||
| | |___ |___ |___ ___] |___ | \| |__] | | \| |___ |
|
||||
| <gan jue; to feel> ver 0.12.0 |
|
||||
| <gan jue; to feel> ver 0.12.1 |
|
||||
|__________________________________________________________|
|
||||
'''.lstrip()
|
||||
# ~ u n s t a b l e e x p e r i m e n t a l b r a n c h ~
|
||||
|
@ -291,5 +292,21 @@ version 0.9.3 features:
|
|||
i'm just making this option available for anyone whose financially stable
|
||||
and wants to kick some spare change my way; this is a labor of love, and i'm
|
||||
happy to work on it regardless :)
|
||||
""",
|
||||
"0.12.1":"""
|
||||
~[version 0.12.1 update]~
|
||||
|
||||
new feature: "visit your subscriptions"
|
||||
* view recent entries from a list of townies you've subscribed to
|
||||
* subscription list is private; no one else can see who you're following
|
||||
* add/remove users from the subscription menu
|
||||
|
||||
minor changes:
|
||||
* global feed now shows 50 most recent entries, which you can scroll through
|
||||
* documentation page updated to reflect new feature
|
||||
|
||||
thanks for those of your who've written me with feedback!
|
||||
|
||||
keep feelin' together <3
|
||||
"""
|
||||
}
|
||||
|
|
210
ttbp/ttbp.py
210
ttbp/ttbp.py
|
@ -51,7 +51,7 @@ from . import chatter
|
|||
from . import gopher
|
||||
from . import util
|
||||
|
||||
__version__ = "0.12.0"
|
||||
__version__ = "0.12.1"
|
||||
__author__ = "endorphant <endorphant@tilde.town)"
|
||||
|
||||
p = inflect.engine()
|
||||
|
@ -529,10 +529,11 @@ def main_menu():
|
|||
'''
|
||||
|
||||
menuOptions = [
|
||||
"record your feels",
|
||||
"record some feels",
|
||||
"manage your feels",
|
||||
"check out your neighbors",
|
||||
"browse global feels",
|
||||
"visit your subscriptions",
|
||||
"scribble some graffiti",
|
||||
"change your settings",
|
||||
"send some feedback",
|
||||
|
@ -567,19 +568,23 @@ def main_menu():
|
|||
view_neighbors(users, prompt)
|
||||
elif choice == '3':
|
||||
redraw("most recent global entries")
|
||||
view_feed()
|
||||
view_global_feed()
|
||||
elif choice == '4':
|
||||
graffiti_handler()
|
||||
intro = "your subscriptions list is private; no one but you will know who you're following.\n\n> here are some options for your subscriptions:"
|
||||
redraw(intro)
|
||||
subscription_handler(intro)
|
||||
elif choice == '5':
|
||||
graffiti_handler()
|
||||
elif choice == '6':
|
||||
redraw("now changing your settings. press <ctrl-c> if you didn't mean to do this.")
|
||||
core.load(setup()) # reload settings to core
|
||||
elif choice == '6':
|
||||
elif choice == '7':
|
||||
redraw("you're about to send mail to ~endorphant about ttbp")
|
||||
feedback_menu()
|
||||
elif choice == '7':
|
||||
elif choice == '8':
|
||||
redraw()
|
||||
show_credits()
|
||||
elif choice == '8':
|
||||
elif choice == '9':
|
||||
subprocess.call(["lynx", os.path.join(config.INSTALL_PATH, "..", "doc", "manual.html")])
|
||||
redraw()
|
||||
elif choice in QUITS:
|
||||
|
@ -690,6 +695,56 @@ def review_menu(intro=""):
|
|||
redraw(top+intro)
|
||||
return review_menu(intro)
|
||||
|
||||
def subscription_handler(intro=""):
|
||||
'''
|
||||
submenu for managing subscriptions
|
||||
'''
|
||||
|
||||
if not os.path.exists(config.SUBS):
|
||||
subprocess.call(["touch", config.SUBS])
|
||||
subprocess.call(["chmod", "600", config.SUBS])
|
||||
|
||||
subs_raw = []
|
||||
if os.path.isfile(config.SUBS):
|
||||
for line in open(config.SUBS, "r"):
|
||||
subs_raw.append(line.rstrip())
|
||||
|
||||
subs = []
|
||||
all_users = core.find_ttbps()
|
||||
for name in subs_raw:
|
||||
if name in all_users:
|
||||
subs.append(name)
|
||||
|
||||
menuOptions = [
|
||||
"view subscribed feed",
|
||||
"manage subscriptions"
|
||||
]
|
||||
|
||||
util.print_menu(menuOptions, SETTINGS.get("rainbows", False))
|
||||
|
||||
choice = util.list_select(menuOptions, "what would you like to do with your subscriptions? (or 'q' to return home) ")
|
||||
|
||||
top = ""
|
||||
|
||||
if choice is not False:
|
||||
if choice == 0:
|
||||
if len(subs) > 0:
|
||||
prompt = "most recent entries from your subscribed pals:"
|
||||
redraw(prompt)
|
||||
view_subscribed_feed(subs, prompt)
|
||||
else:
|
||||
intro = "it doesn't look like you have any subscriptions to see! add pals with 'manage subscriptions' here."
|
||||
elif choice == 1:
|
||||
prompt = "options for managing your subscriptions:"
|
||||
redraw(prompt)
|
||||
subscription_manager(subs, prompt)
|
||||
else:
|
||||
redraw()
|
||||
return
|
||||
|
||||
redraw(top+intro)
|
||||
return subscription_handler(intro)
|
||||
|
||||
def view_neighbors(users, prompt):
|
||||
'''
|
||||
generates list of all users on ttbp, sorted by most recent post
|
||||
|
@ -1275,14 +1330,43 @@ def show_entry(filename):
|
|||
|
||||
return
|
||||
|
||||
def view_feed():
|
||||
def view_global_feed():
|
||||
'''
|
||||
generate and display list of most recent global entries
|
||||
display list of most recent global entries
|
||||
'''
|
||||
|
||||
(entries, metas)= feed_list(core.find_ttbps())
|
||||
list_entries(metas, entries, "recent global entries:")
|
||||
redraw()
|
||||
|
||||
return
|
||||
|
||||
def view_subscribed_feed(subs, prompt=""):
|
||||
'''
|
||||
display list of most recent entries on user's subscribed list.
|
||||
'''
|
||||
(entries, metas)= feed_list(subs, 0)
|
||||
list_entries(metas, entries, prompt)
|
||||
redraw()
|
||||
|
||||
return
|
||||
|
||||
def feed_list(townies, delta=30):
|
||||
'''
|
||||
given a list of townies, generate a list of 50 most recent entries within
|
||||
given interval (default 30 days; 0 days for no limit). validates against
|
||||
townies with ttbp config files.
|
||||
|
||||
returns a tuple of (entries, metas)
|
||||
'''
|
||||
|
||||
feedList = []
|
||||
all_users = core.find_ttbps()
|
||||
|
||||
for townie in townies:
|
||||
if townie not in all_users:
|
||||
continue
|
||||
|
||||
for townie in core.find_ttbps():
|
||||
entryDir = os.path.join("/home", townie, ".ttbp", "entries")
|
||||
try:
|
||||
filenames = os.listdir(entryDir)
|
||||
|
@ -1290,23 +1374,25 @@ def view_feed():
|
|||
filenames = []
|
||||
|
||||
for entry in filenames:
|
||||
## hardcoded display cutoff at 30 days
|
||||
if delta > 0:
|
||||
if core.valid(entry):
|
||||
year = int(entry[0:4])
|
||||
month = int(entry[4:6])
|
||||
day = int(entry[6:8])
|
||||
datecheck = datetime.date(year, month, day)
|
||||
displayCutoff = datetime.date.today() - datetime.timedelta(days=30)
|
||||
displayCutoff = datetime.date.today() - datetime.timedelta(days=delta)
|
||||
|
||||
if datecheck > displayCutoff:
|
||||
feedList.append(os.path.join(entryDir, entry))
|
||||
else:
|
||||
feedList.append(os.path.join(entryDir, entry))
|
||||
|
||||
metas = core.meta(feedList)
|
||||
metas.sort(key = lambda entry:entry[3])
|
||||
metas.reverse()
|
||||
|
||||
entries = []
|
||||
for entry in metas[0:10]:
|
||||
for entry in metas[0:50]:
|
||||
pad = ""
|
||||
if len(entry[5]) < 8:
|
||||
pad = "\t"
|
||||
|
@ -1315,12 +1401,96 @@ def view_feed():
|
|||
user=entry[5], pad=pad, date=entry[3],
|
||||
wordcount=p.no("word", entry[2])))
|
||||
|
||||
list_entries(metas, entries, "most recent global entries:")
|
||||
return entries, metas
|
||||
|
||||
def subscription_manager(subs, intro=""):
|
||||
'''
|
||||
'''
|
||||
|
||||
menuOptions = [
|
||||
"add pals",
|
||||
"remove pals"
|
||||
]
|
||||
|
||||
util.print_menu(menuOptions, SETTINGS.get("rainbows", False))
|
||||
|
||||
choice = util.list_select(menuOptions, "what do you want to do? (enter 'q' to go back) ")
|
||||
|
||||
top = ""
|
||||
|
||||
if choice is not False:
|
||||
if choice == 0:
|
||||
prompt = "list of townies recording feels:"
|
||||
redraw(prompt)
|
||||
subs = subscribe_handler(subs, prompt)
|
||||
elif choice == 1:
|
||||
prompt = "list of townies you're subscribed to:"
|
||||
redraw(prompt)
|
||||
subs = unsubscribe_handler(subs, prompt)
|
||||
else:
|
||||
redraw()
|
||||
|
||||
return
|
||||
|
||||
redraw(top+intro)
|
||||
return subscription_manager(subs, intro)
|
||||
|
||||
def unsubscribe_handler(subs, prompt):
|
||||
'''
|
||||
displays a list of currently subscribed users and toggles deletion.
|
||||
'''
|
||||
|
||||
subs.sort()
|
||||
|
||||
choice = menu_handler(subs, "pick a pal to unsubscribe (or 'q' to cancel): ", 15, SETTINGS.get("rainbows", False), "list of townies recording feels:")
|
||||
|
||||
if choice is not False:
|
||||
townie = subs[choice]
|
||||
subs.remove(townie)
|
||||
save_subs(subs)
|
||||
redraw("{townie} removed! \n\n> {prompt}".format(townie=townie, prompt=prompt))
|
||||
return unsubscribe_handler(subs, prompt)
|
||||
else:
|
||||
redraw()
|
||||
return subs
|
||||
|
||||
def subscribe_handler(subs, prompt):
|
||||
'''
|
||||
displays a list of all users not subscribed to and toggles adding,
|
||||
returning the subs list when finished.
|
||||
'''
|
||||
|
||||
candidates = []
|
||||
|
||||
for townie in core.find_ttbps():
|
||||
if townie not in subs:
|
||||
candidates.append(townie)
|
||||
|
||||
candidates.sort()
|
||||
|
||||
choice = menu_handler(candidates, "pick a townie to add to your subscriptions (or 'q' to cancel): ", 15, SETTINGS.get("rainbows", False), "list of townies recording feels:")
|
||||
|
||||
if choice is not False:
|
||||
townie = candidates[choice]
|
||||
subs.append(townie)
|
||||
save_subs(subs)
|
||||
redraw("{townie} added! \n\n> {prompt}".format(townie=townie, prompt=prompt))
|
||||
return subscribe_handler(subs, prompt)
|
||||
else:
|
||||
redraw()
|
||||
return subs
|
||||
|
||||
def save_subs(subs):
|
||||
'''
|
||||
takes given subscription list and saves it into the user config,
|
||||
overwriting whatever is already there.
|
||||
'''
|
||||
|
||||
subs_file = open(config.SUBS, 'w')
|
||||
|
||||
for townie in subs:
|
||||
subs_file.write(townie + "\n")
|
||||
subs_file.close()
|
||||
|
||||
def graffiti_handler():
|
||||
'''
|
||||
Main graffiti handler.
|
||||
|
@ -1710,15 +1880,15 @@ something strange happened to you during this update.
|
|||
# version 0.11.0 patch notes
|
||||
print(config.UPDATES["0.11.0"])
|
||||
|
||||
if y < 11 or z < 1:
|
||||
if y < 11 and z < 1:
|
||||
# version 0.11.1 patch notes
|
||||
print(config.UPDATES["0.11.1"])
|
||||
|
||||
if y < 11 or z < 2:
|
||||
if y < 11 and z < 2:
|
||||
# version 0.11.2 patch notes
|
||||
print(config.UPDATES["0.11.2"])
|
||||
|
||||
if y < 11 or z < 3:
|
||||
if y < 11 and z < 3:
|
||||
# version 0.11.3 patch notes
|
||||
print(config.UPDATES["0.11.3"])
|
||||
|
||||
|
@ -1726,6 +1896,10 @@ something strange happened to you during this update.
|
|||
# version 0.12.0 patch notes
|
||||
print(config.UPDATES["0.12.0"])
|
||||
|
||||
if z < 1:
|
||||
# version 0.12.1 patch notes
|
||||
print(config.UPDATES["0.12.1"])
|
||||
|
||||
confirm = ""
|
||||
|
||||
while confirm not in ("x", "<x>", "X", "<X>"):
|
||||
|
|
Loading…
Reference in New Issue