Q version 3.34: Setup file optimizations, no longer require admin. Q version 3.33: Fix GetHashTags in filtered buffers, report how many saved searches are being loaded. Haden version 3.32: Smashing the buggies. Haden version 3.31: Updated readme and todo. Q version 3.30: Fix filtered buffers to work with GetMentions and the like. Q version 3.29: Allow individual timelines to respect the retrieve count. Minor tweeks to insure a better building experience. Q version 3.28: Updated documentation, fixed followers and friends buffers. Added classic mode sound system if the beta's broken, select on sounds tab. Haden version 3.27: One more small change to the configuration dialog. Haden version 3.26: We can now export to .txt format successfully. Q version 3.25: Fix filters to actually work using the new method. They're stackable and monitor their sources and amazing. Also fixed new replies to be spoken as mentions. Q version 3.24: Renamed some buffers. Q version 3.23: New database startup code, not yet used. Lots of work on buffers, index-based props finally actually work. Tell me if this changes how quickly posts are actually read. Fixed individual buffers. Fixing .index means jumping to posts should work again without the odd behavior it used to exhibit. Justin version 3.22: Updated the readme to document new commands. Q version 3.21: Switch the sound subsystem to use events to play to get around audio not being to play from other than main thread, if your sounds were suddenly getting cut off before this might fix this. Many tweaks to buffers including a new function, GetPosts, which accepts a min and max, and returns all posts between and including min and max. Gave buffers their own shutdown method. Remove Borris's soundpack as it's in Soundpack Central. Work on rewriting filters, currently incomplete. Haden version 3.20: More work on the configuration dialog. We're getting closer. Added required dependencies. Q version 3.19: Switch back to using pyaudiere without the evil Jaws difficulties. Fix a weird little thing that was breaking individual dialogs. Theoretically updated public timeline to use new framework. Haden version 3.18: Fixed a bug that did not allow you to unfollow someone. Q version 3.17: Switched most buffers over to using an event-driven update system. For details, look at buffer/buffer.py's __init__ and Update functions. Added necessary pydispatcher dependency. Medium buffer cleanup, removing unnecessary code and refactoring internals to standardize the buffers some. Work on filtered buffers, although I intend to fully rewrite these with the new event system, stacking them should at least work again. Optomize the database shutdown routine to only vacuum the database if required. Thread off the twitter startup/authorization process for a more snappy startup. Make sure the login failure dialog is in focus. Bit more logging all around. Added signals.py to define signals for the event system. Haden version 3.16: Commented out the export keystroke and other things from qwitter.confspec and keymap.confspec. Haden version 3.15: Enjoy the use of the cancel button in the config dialog. A start on an optional GUI. Small update to notification_area.py for when we have a qwitter.ico file. Q version 3.14: Created an InitializeTwitter function in twitter_helper.py to handle all our initializing and auth checking and the like. Inform user on login failure. Welcome message, bit more work on the notification area icon. Haden version 3.13: Fixed the title of the configuration dialog. Alastair version 3.12: made paths.py and config.py work correctly under linux. Haden Version 3.11: Switched to using sc.SizedPanel for the pages of the config dialog. It still has some bugs though not as many. Alastair version 3.10: Add xml to dictionary parsing for later soundpacks support. Q version 3.09: Replaced the next/previous post code in the sql buffer class to not rely on the id column to always be in order, instead ordering the column itself and finding the next post with a > or < id. Tell me if this slows us down any. Added forgotten dialogs/twitter_individual.py which gives us our nice little new individual dialog. Q version 3.08: Created a dialog to determine which person to obtain individual timeline buffers on and added it. Fixed GetMentions to not return an @ before usernames, adapted code that had excluded said @. Q version 3.07: Finished splitting dialogs out into separate files. Only left the config dialog in dialogs.py for Haden. Tell me if any dialogs, (other than the configuration dialog), don't work? Q version 3.06: Revamp the direct message dialog. It was incorrectly limiting characters, and the title wasn't updating if you changed the username. Q version 3.05: Begin splitting dialogs off into separate package, most are still currently broken. Haden Version 3.04: We have a new configuration dialog. It uses wx.Notebook. This means that it has multiple tabs. There are several errors however. See bugs.txt for more details. Also, work on the exporter, finally fixed the new/view tweet dialog, and a start at a system tray icon. We need someone to create a qwitter.ico file which is an icon for the system tray thing to work. Q version 3.03: Fix forcing updates in replies and trends. Q version 3.02: Modify the buffer updater so that it's fully self-contained and can be threaded. Threaded it off to prevent freezing when update is taking ages. Updated tweets and search buffers to respect the readNum config option. Wrote a GetColumns function which I will utilize in the feaux ORM. Started building post objects, sql-backed posts should provide read/write access to their properties and the reading part will actually work, still need to work on the writing sql... Removed some unnecessary logging. Q version 3.01: If updates fail, now, all the dialogs come back up! Q version 3.00: Fix a possible bug with searching. Make a stab at bringing dialogs back up when posting fails. Q version 2.99: Make sure that viewing a tweet doesn't break in trends/elsewhere where we can't get a screen name to associate with a tweet. Q version 2.98: More work on the twitters session, going to need to change twitter_helper.py/globals.TwitterApi over to this system, anyone have ideas how we can turn sessions into folders? Alastair version 2.97: Fixed searching. Q version 2.96: Sessions will now take over most of the functions that buffers.py handled. Ported the twitter buffers over to the session system. Q version 2.95: Modernize keyboard.py slightly. It will need some rewriting as sessions are activated. Beginnings of sessions. Fixed searching for real. Q version 2.94: If posting an update fails, bring it back up. Won't work for replies/dm's yet because of structure. downgraded twitterapi, still broken? Q version 2.93: Polished up buffer/sql.py to prevent any possible errors, log better, etc. Updated twitterapi from git hub, report problems. I believe this update should enable ssl, someone confirm. Q version 2.92: Update documentation, few cleanings. Readying for an alpha or something. Tyler version 2.91: Switched to using os.path.getsize in setup.displayInfo because it's a dedicated function for getting the file size. No point using os.stat, which gives more info than we really need. Q version 2.90: Integrate the stub of internationalization support, I suspect we'll need this for our $time stuff at the very least. Q version 2.89: If replying to a tweet you have sent, reply to the first username mentioned in that tweet if thare are any, and if the new config value, replyToSelf is left to its default, False. Clean up and improve GetMentions to strip any yuck chars off the ends, tell me if I've missed any. Q version 2.88: Fixed string templates for messages. Q version 2.87: Fixed dismissing filters to not murder the buffers next to them. Q version 2.86: Removed unnecessary code from copy to clipboard in search buffers. Strip out last of the storage.py system, deleted the file. Filtered buffers now dismiss in a jiffy, as do searches. replaced each buffer vacuuming the database during its shutdown sequence with a single vacuum on app shutdown. Added an index property on buffers which maps to get/set index, ported interface.py to use. Fixed a few functions, mainly shutdowns, weren't being called because of MIxeD cAsE. Added more logging. Write the config after setting current buffer. Fixed to fail more cleanly when a buffer index can't be obtained. Added and utilized a shutdown method in db.py. Fixed saved searches not actually getting saved. Haden version 2.85: Use propper string templating for search templates. Q version 2.84: Use proper string templating for our templates. Haden version 2.83: Changed statuses.friends_timeline to statuses.home_timeline in tweets.py. This will soon replace status.friends_timeline, so I went ahead and did it. Fixed some bugs in the update system. We now get to the part where qwitter exits. At this point, the update system is exitted to and therefore we are at a stop. A function needs to be written to restart qwitter. Q version 2.82: Fix GetHashTags if there *aren't actually hashtags in the current message. Beginnings of my buffer-side GetUrls code. Stub of the exporter. Added things to todo. Tyler version 2.81: Fixed clearBuffer, as per @hadenpike's instructions. Haden version 2.80: When calling a search dialog, it now uses a new function called GetHashTags in twitter.py to check for hash tags. Now other functions can use it. It requires an index parameter. Also added retweet checkbox to new tweet dialog. This is only visible when calling view tweet. If checked, the tweet is passed to the retweet function. Temporary fix for title bar not displaying number of chars in post. Q version 2.79: Announce if in mute mode on application initialization. Haden version 2.78: I broke search buffers earlier, fixing. Q version 2.77: Made a stab at forcing wx to write its log to the AppData dir so as to avoid having bad things happen with initial tracebacks on secure NT systems. Wrote a conventions.txt file outlining some of the most common code conventions we utilize for new programmers on the project. Feel free to update as necessary. Q version 2.76: Fixed up my breakages in interface.py, made all the New* functions cleaner. Q version 2.75: Further modernized interface.py. Upgraded buffers.GetBufferIndex to take 0 args, returning the index of the current buffer. Added more logging. Haden version 2.74: Introducing the new and improved new tweet dialog. Haden version 2.73: Documented how to modify templates in the readme. Added a keystroke reference section to the readme. It's currently a table listing the function name, the keystroke to call it, and a description of that key. Strip parenthesis off of URL's/screen names when bringing the URL choice dialog into focus. The twitter search dialog now behaves more like the follow dialog, E.G, if the current tweet contains hash tags, they appear in the combo box. Use down arrow to get to them. The search buffer can now use all of the replacement variables for templates that are available to other templates. Q version 2.72: Yet more modernization of interface.py, navigating through tweets should theoretically now be faster, I'd like real-world impressions of this. Modified buffers.RemoveBuffer to not explicitly set to the previous buffer index, let the DismissBuffer code or whatever handle it. Made the shutdownthreads in buffers daemonic just in case we want to die quickly so as not to hang around during system shutdown and whatnot. Afraid this may bring back zomby saved searches, will have to research another fix. Modernized the List URLs code. Fixed a possible bug where Qwitter might choke when DM'ing someone with odd characters in their screen name. Q version 2.71: Updated more of interface.py to bring in line with new convention. Fixed direct messages not being able to take unicode characters. Dismiss buffer now indicates what buffer it cannot dismiss. Q version 2.70: Fixed individual timelines in cases where a since_id wasn't provided. Allow the friends/followers fetching functions in twitter_helper.py to accept a username to return information on, if none given, default to the current user's screenname. Haden Version 2.69: Made qwitter strip the most common punctuation marks off of the end of URL's and screen_names. Q version 2.68: Initial work towards the "fetch more" system. Modernized some more of interface.py, but stuff still doesn't all work like I'd like it to. More work on the updater system. Q version 2.67: Let's make those unicodes, not str's, that way they don't break on non-ascii stuff, eh? Q version 2.66: Fix bug where posts with only numbers would break things. Miahtech version 2.65: fixed bug with replying to dm's with ctrl+win+r; Haden came up with fix, I just committed Q version 2.64: More update work, still not done. Remove unneeded dirs. Various other little improvements, change paths.py to retrieve the current file's path correctly. Tyler Version 2.63: Fixed syntax error in src/svn.py: there was a ) without a matching (. Tyler version 2.62: Added configobj, py2exe, and wxpython to dependencies directory. Haden version 2.61: Removed unneeded files from dependencies. Haden version 2.60: Rebuilt dependencies directory. Q version 2.59: Re-add some necessary files for installer. Q version 2.58: Add important forgotten files that svn didn't pick up on. Bad svn. Q version 2.57: Attempt svn rebuild, all old changes lost. Please rebuild dependencies directory. Tyler version 2.56: Deleted dialogs.py.old, replaced text of broken dialogs.py with text of that file. Silly me, I didn't think of that when I was committing the previous revision. :) Tyler version 2.55: Whoops, forgot to commit dialogs.py.old. Tyler version 2.54: Include old copy of dialogs.py--rename dialogs.py.old->dialogs.py. Haden version 2.53: Include pysvn in dependencies directory. Q version 2.52: Include forgotten updater.py -- the guts of the updater system. Q version 2.51: Fix broken filters. Initial work on the updater, not currently working but committed because I must sleep. Update setup.py to let uac know that the app needs admin rights. Q version 2.50: Attempt to have searches dismiss faster. Q version 2.49: Make searches no longer update, counting on the buffer to handle it to remove search freezing. Q version 2.48: Correctly added new buffers to buffer package. Created single-user timeline buffer and bound to control+win+i. Made table syncing not break on weird table names. Q version 2.47: Removed lots of legacy code that used storage.py and updated with buffer-using code. Yummy. Still more required before we can get rid of storage.py for good. Q version 2.46: Fix a syntax error, write code to sync up database tables, or, at least, add new columns to them. Q version 2.45: Removed full caching of followers and friends, let the buffers do their jobs, now. Wrote a simple API to the tweetblocker service for later antispam work. Threaded off buffer shutdowns for yet more snappyness. Small sql buffer cleanups, version updating, code cleanup. Q version 2.44: Consolidate a lot of code from friends and followers into a new, improved, shiny users buffer class. Clean up spelling of a few messages in interface.py. Update the dismissing buffer code so old buffers don't get to hang around anymore. Q version 2.43: Make a stab at killing some memory leakage by defining data as a prop which accesses the database tables on sql buffers. Q version 2.42: Updated both followers and friends buffers to work as sql-backed buffers that don't suck terribly. Haden version 2.41: Fixed a syntax error in setup.py. Also added statuses.retweet_to_me to twitter_helper.py in preparation of the retweet API. Q version 2.40: Removed a bug where saved searches weren't properly handled on shutdown. Threaded off dismissing of saved searches so a laggy API doesn't slow us down. Minor tweaks to qwitter.confspec for a friendlier experience. Small edits to setup.py to make it a bit nicer. jhsw version 2.39: Added AutomaticallyRT checkbox to config dialog. Haden version 2.38: You can now change whether qwitter automatically rt's tweets or whether the text is placed in the new tweet dialog. To toggle this, change the value of AutomaticallyRT in qwitter.conf. Haden version 2.37: Switched device notifications from a yes/no dialog to toggle. Added a key to check how many API calls you have left this hour. Currently control+win+a. Also, organized and updated twitter_helper.py. Haden version 2.36: Fixed a bug that was causing a runtime error. Haden version 2.35: You can now update your profile from within qwitter. Currently control+shift+win+p. Haden version 2.34: You can now turn device updates on and off for a user. Currently control+shift+win+d. Q version 2.33: Made the database code less likely to choke on odd table names. Stab at modernizing the followers buffer. Q version 2.32: Switched back to the old sound subsystem to prevent errors and issues with restarting jaws. Bloody Freedom Scientific. Haden version 2.31: By default, the dm dialog defaults to the edit field, unless no user name was found in the focussed tweet, in which case, it defaults to the dm who field. Q version 2.29: Fixed a bug introduced by Haden which rendered dm dialog box titles uninformative. Haden version 2.29: Now when calling the direct message dialog, you have an option to enter the screen name of the person you want to dm. The user name of the focussed tweet is already prefilled in the box. Q version 2.28: When dismissing a buffer, try to go to the index where the tweet in that filter was in its parent buffer. Also, don't drop back to tweets by default, instead, try staying in current buffer on dismissal. Fix saved searches initializing. Q version 2.27: Try to make this dialog so the tweets can be completely viewwed! Q version 2.26: Update confspec file to reflect replacement with oggs. Update setup.py to work with numpy. Q version 2.25: Replace all .wav's with .ogg's thanks to using the new sound subsystem. Dramatic installer size shrinkage. Q version 2.24: Rewrite sound.py to use a single audio thread. Include numpy in dependencies. Note I built it from svn snapshot so poke me if it's broken. Tyler version 2.23: Added support for removing "_svn" from sound packs list in dialogs.configurationDialog.updateValuesFromConfig Q version 2.22: Switch to using pyaudiere instead of wxpython for sound output. This opens up being able to play oggs, panning, etc. Download required, information in dependencies.txt. Q version 2.21: Thread off posting dm's, retweets, and replies to make them snappier. Q version 2.20: Spurious saved searches don't pop up anymore. Nifty. Haden version 2.19: Screen names can now be spoken instead of the users name when reading tweets. This can be achieved by changing the following line in qwitter.conf. tweetTemplate = "$when, $name posted $message" Change $name to $screen_name. I'm planning to attach this to a hotkey as soon as I can find one. Tyler version 2.18: Consolidate some statements in keyboard.py--when accessing the i array in InitializeHotKeys, convert the "key" value to lowercase in the same statement as it's assigned a value from either i[3:] or i[4:]. Q version 2.17: Thread off the saved search loader so we don't get that yuck lagtime on startup. Q version 2.16: Added jump to post dialog, control+win+j. Thanks, @brucetola. Added a help message for the portable option to the command line option parser. Added logging to the public timeline buffer for if it busts. Q version 2.15: Updated readme/other such things to ready for release. Haden version 2.14: Just a small change to fix https support. Tyler version 2.13: Made some changes to notes in dependencies.txt. 1) pysqlite3 not required under Python 2.6. 2) Gave wxpython website for dl of v2.8.10.1 (MSWin32 unicode tested and working here under py2.6). 3) Wrote "download required" next to configobj as it is no longer provided in the dependencies folder. Q version 2.12: Force new tables to not allow duplicates. Filters update correctly now. Q version 2.11: Add more logging for when this is released and stuff breaks in various ways. Add config option, autoReadNum, which, when set to False, tells speech not to automatically say how many new posts came in. Wiw. Somehow, magically fix things with filters except now they don't update. Q version 2.10: Sanitize db tablenames in a nice, clean, consistent way. Log when sounds don't work so we can let soundpack creators know. Have CreateSavedSearch return the id of the saved search. Close pesky still-open database cursors. Play nicer with unicode searches. Haden version 2.09: Added two controls to configuration dialog to control SAPI speech and volume. Also added https to qwitters supported links. Q version 2.08: Make indexes announce starting from 1 at the top. Fixed saved searches to kill themselves correctly. Caught a possible bug with table creation -- why isn't db.TableExists() working? Q version 2.07: Utilize twitter's saved searches buffer to save persistent searches. Load saved searches on start. Add end flag to buffer shutdown to indicate if the app is ending. Q version 2.06: Added GetMentions to the twitter buffer to get all @people from a tweet. Made Qwitter remember and restore the buffer you were in at program exit. Added methods in twitter_helper.py to list, add, and remove favorites. Added more sounds. Multithreaded dismissing of buffers so it's speedy mcspeederson. Q version 2.05: Fixed stacking filters. Added new calls to sounds. Q version 2.04: Made updating filters work. Still need to get stacking worked out Q version 2.03: Update readme. Add message once config is complete. Don't let filters with #'s in them break sqlite. Q version 2.02: Add public timeline. control+win+p. Q version 2.01: Finally make the search buffer a twitter buffer. Put update hooks into all update functions. Cleanup shutdown sequence. Q version 2.00: Optimized filters dramatically. Enabled filter stacking. Forced retweet warning to interrupt on speak. Fixed db.CreateCursor to always return a usable cursor, even if not optimally storing and whatnot. Store old buffers to shutdown later if necessary. Force trends, followers, and friends to not respawn themselves. Added a GetBufferByName function to the buffers library for easier finding of buffers. Many small tweeks and code changes. I expect many, many bugs. jhsw version 1.99: Implemented DM safe mode which, when enabled, disables retweets in the Direct Messages buffer. Also, when the reply hotkey is used in the Direct Messages buffer, a direct message is sent instead of a public reply. Q version 1.98: Fixed inclusive filters, shrink dialogs. Q version 1.97: Added basic filters. Currently control+win+shift+f to apply filter, then decide if want all posts except those with your term in it, the default, or only to return the posts including your term. use the checkbox. Q version 1.96: Added Clear buffer keystroke: control+win+shift+delete. Added RemovePost function in buffers. Q version 1.95: Made all edit boxes the size of the display! Added checkbox to toggle if searches are saved in-db. Note you have to re-initiate the search to see the old results. Q version 1.94: Groundwork for persistent search/trends data. Make most buffers sql-backed. Q version 1.93: Load password in config dialog for ease-of-use. Make sure sound pack is selected in combo box in config dialog. Q version 1.92: Add any users mentioned in a message to a follow edit combo now. Note that you have to hit down arrow twice to see all of them. How to fix? Q version 1.91: Remove unnecessary imports from various files of buffer package. Alastair version 1.90: Split buffer.py into a buffer package. Q version 1.89: Fix the URL handle dialog to handle links preceded by a dash, without, as it used to do, dropping them in the trash. Thanks, @brucetola Q version 1.88: from log import logging somehow got deleted from twitter_helper.py. Fixed. Q version 1.87: Fix on flaky indexes being set for trends and searches. Also make sure the search dialog's in focus. Q version 1.86: Stab at fixing followers/friends lists. Fix clear method to reset the data list, which means showing all trends, and make sure the ListUrls dialog is visible on launch. Q version 1.85: Update version, make sent dm's respect retrieveCount, minor tweaks. Q version 1.84: Remove logging, update readme, fix database code, deactivate loading from library.zip for perhaps simpler autoupdate in future. Q version 1.83: Remove old database code that's no longer used such as DestroyCursor and SyncDatabase. Q version 1.82: Direct all buffers to download config['client']['retrieveCount'] as the only reason we didn't before is the old API didn't support. Rewrote the db.NewConnection function with guidance from http://www.yeraze.com/2009/01/python-sqlite-multiple-threads/ in practical terms this should theoretically mean no more threading issues with the db. fix GetAppDir in paths.py to reliably return the application's directory instead of "." Q version 1.81: Make a stab at a long-standing (since 0.1) bug that would randomly cause some dialogs to be out of focus when launched. Thanks, @tspivey, for the idea. Activate some more logging in new places in order to track down a strange bug. Add the Go Tweeting! soundpack, thanks @pitermach. Q version 1.80: A few cleanups with the new friend/follower buffers. Q version 1.79: Add buffers with friends and followers. control+win+left bracket for friends, right bracket for followers. Q version 1.78: Update readme. Q version 1.77: Add mute command. Q version 1.76: Fix: Direct messages download again. Dialogs work. Q version 1.75: Add readme as html. remove text. Q version 1.74: Add direct messages to sent buffer. Note: Hackish, ugly, running up against the limits of the system, requires infrastructure change. Also, when invoking the search dialog from the trends buffer, prefills the text box with the term you're sitting over. Q version 1.73: Prevent broken auto-filling buffers from interrupting the buffer registration process. tspivey version 1.72: fix html_filter.StripChars to work properly and return unicode. Q version 1.71: Add unfollow: control+win+shift+l. Fix a case when a buffer would kill itself and not even care! Added output.AnnounceIndex to announce the index of the current buffer, call it with CurrentTweet. Q version 1.70: Update readme. Much better Unicode support. Q version 1.69: Fix copying post to clipboard to call a buffer-specific method to work, FormatPostClipboard. Now you can copy from searche, trends, and other future buffers sans issue! Q version 1.68: Set the insertion point to the beginning of the New Tweet dialog for when it has text. Thanks, @coke_drinker. Reverse trends so they're actually in order when shown. Hint: you start at the bottom. Q version 1.67: Improve handling of non-standard buffers. More to do. Q version 1.66: Added trends buffer, currently control+win+t, as a test case to see how hard building buffers is. Reworked some of the harder bits to not be. Modified DismissBuffer to work on any buffer who has its CanDelete to 1. Removed no longer required input.py Q version 1.65: Clean up ListUrls dialog, add follow dialog. Currently control+win+l, prefills edit field with the person who you're hoving over in buffer. Q version 1.64: Add CreateTable function to db.py as expected by new buffers. Several fixes to make it work with new users again... Q version 1.63: Fix a reconfigure death bug. Q version 1.62: Shut down old search buffers once they're removed so they don't drain twitter API calls. Q version 1.61: Minor fixups to dialogs.py. Add i18n.py with the beginnings of work towards internationalization. Fix GetScreenName to actually return a screen name, not a name for twitter-like buffers. Make search buffers auto-update. Q version 1.60: Add a bug to bugs.txt. Q version 1.59: Fix replying/directing to call on the buffer to get a screen name. Q version 1.58: Working search support! Q version 1.57: Several code cleanups. Now make buffers handle formatting their own output with their FormatPost method. finish search buffers. Add search template. Q version 1.56: Beginnings of search support. Add twitter_search.py with helper functions and a basic search buffer which you instantiate with a string term, and when you call its .Update method, it does a search for that term on Qwitter. Q version 1.55: Remove old code which uses the python twitter API and replace with new, better, shinier code which supports the other new thing. Port all instances of NewTwitterApi over to TwitterApi. Q version 1.54: Add missing file to make twitterapi work. Q version 1.53: Connect all four standard main buffers to the new twitterapi class instead of the python twitter API. Q version 1.52: Added Mike Verdone's twitter API under twitterapi in src. Going to port to using this for oodles more functionality and flexibility. Q version 1.51: Function reshuffling, move AnnounceBuffer to output.py and update appropriate calls. Add shortcut to changelog to start menu. Several minor code cleanups. Q version 1.50: Add view log file shortcut to start menu. Update version. Fix a tiny chance of a bug when it comes to speaking new posts. Add indicator when force update fails to retrieve new posts. Note: when it does this really quickly it means you've hit up against my 1 minute caching -- you can't do more than one update in a buffer in a minute, although you can do an update in each buffer. And really the caching isn't mine, it's what I've got working with the python twitter API. Keyboard code cleanup, still requires a bit more. Re-written exit Qwitter function, currently non-functional. Q version 1.49: Integration of the new buffer objects with the rest of the code. Currently they're functioning via adapters in storage.py so most things are unchanged, but sounds play now only once per chunk of updates. I'll document buffers more as I go along fastfinge version 1.47-1.48: Added con.text_factory = str in db.py to fix terrible, terrible qwitter bug that would cause qwitter to crash and refuse to restart when people on your timeline used non-english characters. Q version 1.46: Improve/debug buffer code. Add twitter buffer class. Q version 1.45: Minor cleanup in qwitter.pyw. Just getting a stable jump-off point for adding buffers. Q version 1.44: Added buffers.py as a simple library to work with buffers. buffers is now a new global variable in globals, although to manipulate it you should use the buffers library. If you need to do something with buffers, add it to this library. Q version 1.43: Buffer updates. Added all main buffers to buffer.py Q version 1.42: Remove any svn directories from final build. jhsw version 1.41: Added the ability to choose the maximum number of tweets to pull from Twitter in the config dialog. Q version 1.40: Re-add dm limit, 140 chars for now. Q version 1.39: Added soundpacks to configuration dialog. Added two to test. Thanks goes out to Patrick Perdue and Oriol Gomez. Several minor code cleanups. tspivey version 1.38: Fix speaker so SAPI works as expected in configuration dialog. tspivey version 1.37: Fix db.py so it tries sqlite3 after pysqlite. Q version 1.36: Remove unnecessary screen reader choices from configuration dialog, let the auto code decide. Compress scp streams in release.bat. tspivey version 1.35: Fix sapiSpeaker so it can be silenced. Added silence to all the rest so they won't break. tspivey version 1.34: fix wineyesSpeaker in speech.py so that interrupt calls Silence if set before speaking. Q version 1.33: Don't die when started from other than the working dir. Don't be a total twat about opening your config file from the wrong place anymore. Thank you. Q version 1.32: qwitter.pyw code cleanup. Q version 1.31: Added basic command line parser. added portable mode to make Qwitter run from thumb drives and keep everything in current directory, -p or --portable. Fixed code that would cause traceback on first start after configuration shown. Bit more buffers work. Q version 1.31: Re-add all dependencies. Whoops? Also fix a minor new buffer bug. Q version 1.30: Re-Initialize the twitter API after configuration dialog. More work on the buffer class, separating out a standard buffer from sql-backed buffers. tspivey version 1.29: reworked speech.py to try to autospeak through anything available. Q version 1.28: Re-initialize speech after displaying the configuration dialog so you don't have to restart Qwitter for your screen reader choice to be applied. Q version 1.27: Actually add the html_filter.py code, thanks Tspivey. Q version 1.26: Use tspivey's html filtering code to clean up incoming tweets. Q version 1.25: Sync up with python-twitter svn tree. Q version 1.24: Make the buffer class follow the iterators protocol. Note that calling for item in buffer starts at the buffer's .GetIndex() Q version 1.23: More buffers updates. Move URL to *always* be first in the browse tweet dialog. Q version 1.22: Beginnings of yet-again revised buffers code. Initial skeleton of a buffer class in buffer.py. New function, TableExists, bool true/false in database. Default check interval increased to 4 minutes after loading from config file broke. tspivey version 1.21: Dramatically shrink setup script. Add choice to add Qwitter to startup menu. Q version 1.20: Fix: re-allow launching from anywhere by referencing AppPath. Add DataPath and AppPath to globals. Fixes especially re-launching after first start. Q version 1.19: Move database into appdata\qwitter directory. Q version 1.18: Removed unnecessary keymap.conf Q version 1.17: Read and write anything to the appdata\qwitter directory to be more kind to Vista. Switched over to using a confspec for hotkeys. Release compiled with latest wxpython to resolve a possible manifests bug. Switched paths.py to use os.environ instead of pywin which was erroring on compile. Q version 1.16: Added paths.py to handle different path-related functions. Updated sound.py to use these functions. Q version 1.15: Fixed conflicting StopSapi keystroke. Q version 1.14: Code cleanup. Fix ShowConfigurationDialog to preload all but password information. fastfinge version 1.06-1.13: added basic SAPI support, and a hotkey to stop sapi speech. Q version 1.05: Re-order the browse to dialog so URLs come first, followed by any usernames in the tweet, followed by the tweeter's username. Q version 1.04: Added retweeting: currently control+win+shift+r. Q version 1.03: Updated the keyboard handler to use the actually-existing m_keyCode for logging broken key events. Fixed the positioning of the Automatically speak Tweets checkbox. Q version 1.02: Fix interface.py Q version 1.01: Actually add qwitter.iss Inno setup script. Q version 1.00: Fix the direct message limit to not warn if a message exceeds 140 characters. Make config and sounds pull their own paths so qwitter can be run from anywhere. Re-added interface.py to svn. Add the MIT license. Write config after setting index, Thanks Alastair. Remove Jawter sounds. Update setup.py to automate more -- note that you now need inno setup to run setup.py, comment out the appropriate bit to not need it anymore. Moved readme.txt to dependencies.txt. Added readme.txt, Thanks Miah! Wrote Inno setup script. Grew all tweet/reply/dm dialogs so all text is visible. Added release.bat script to make releasing build to website easier. Q version 0.99: Fixed new tweets actually post now. Reactivated ctypes... Q version 0.98: Reply dialog brought in line with direct message dialog. Should and will combine soon. Code cleanup. Configuration file cleanup. Added reply sounds. Q version 0.97: No longer show an empty window for the executable. Add more logging, trim off spurious colons when browsing to a username. Q version 0.96: Add the in_reply_to_status_id parameter as optional to PostUpdate and take advantage of it. Also add the jfwapi dll as a necessary part of the package, finally? Q version 0.95: Add @username links to the browse dialog. I'd like to later replace this with a way to pull up our own user dialog on them. Suggested by @ultraleetj Q version 0.94: Fix an accidental addition to a bit of dialogs.py Q version 0.93: Basic direct message support. Currently you must be over a person's tweet who you want to send a dm. control+win+d, as always can be changed in keymap.conf Daiverd version 0.92: added ctrl+win+pageup and down to jump by client step where step is a percentage of sorts Q version 0.91: Add pageup and pagedown to keys that can be registered. Q version 0.90: Removed some old unneeded configuration file options, added sentIndex to config, switched to using wx.Sound for playin sound for any possible future cross-platformishness. Daiverd version 0.89: quit qwitter is back! Q version 0.88: Removed a spurious bit of debug code. Fix previous commit message. Q version 0.87: Wrote the function to fill the sent buffer. Still need to kill some hardcoding crappage especially in the Check* functions. Reminded the primary checker to check *all* buffers. Fix new direct messages not being announced as directs but instead as tweets. Q version 0.86: Remove hardcoding from AnnounceBuffer so it actually checks the buffers for their names. Disable the unread bit for now as it was flaky and needs rethinking. Enable the sent buffer, still need to write its function in input.py Q version 0.85: Create any tables in the database if they don't exist, retrieving table data from the BUFFERS dictionary defined in storage.py. Q version 0.84: Define the new BUFFERS dictionaries in storage.py and reset most helper functions to return the correct keys. Defined sent buffer, commented out until I write the db sync code. Q version 0.83: Add ability to copy current tweet to clipboard, move templates into their own specific section of the configuration file. Currently control+shift+win+c to copy to clipboard. Q version 0.82: Switch to pulling down 100 tweets at a time, settable on config. Only retrieve tweets newer than the max twitter_id. Q version 0.81: Cleaned up some code, added more and better loggage. Q version 0.80: Added globals.py, forgot to before. Moved PostTweet into interface.py, it needs somewhere better to live. Direct messages update again, at least manually. Q version 0.79: Add tweet_id to all tweet-related database tables. Will be used very soon! Q version 0.78: Add the forgotten output.py which handles speech output and hopefully more later! Q version 0.77: Major code refactoring. Connect buffers to respective functions to fill them up, abstract lots of the code out of the main qwitter.pyw into subsystems for storage, input, and output. Many minor code cleanups, although I'm sure I broke plenty. Q version 0.76: Make the CheckTweets and other checking code more robust. These need to be connected. Q version 0.75: Buffers cleanup to fix cyclic buffer navigation. Q version 0.74: Clean up buffers.py to completely use the BUFFERS constant, move TableFromBuffer into buffers.py. Q version 0.73: Add a list of what I consider to be important things to do to the todo list. Copy documentation into the exe build. Q version 0.72: Kind of sloppy but it works; setup the api object if not already initialized. Q version 0.71: Improve the code that returns a table name for a buffer to use the new BUFFERS global. Q version 0.70: Define buffers in a far more logical and better way. Still need to port a bit of code over to using this new BUFFERS constant. currently a list of [config file key for index, table of associated data] Q version 0.69: Final fixes to clean qwitter.pyw up. No more two starting functions, everything's handily handled in main() Q version 0.68: Make qwitter.pyw actually work with new configurations... Q version 0.67: Clean up qwitter.pyw so that it can actually get tweets and check if it's configured on first run. Q version 0.66: Change the log format a tiny bit, activate the replies buffer, standardize receiving and processing of the different types of tweets. More standardization is necessary, in particular making it easier to define new buffers. Q version 0.65: More logging, even for strange and wonderful things that probably won't happen. Removed one of the three loops through the startup sequence. Spaghetti untangling. Q version 0.64: More logging for many things, use a better check for configuration, remove unneeded code. Q version 0.63: Upgraded logging support for db.py. Q version 0.62: Basic multi-user support -- one username, one database. This opens up the possibility, once it's perfected, of storing all information user-centricly in a database instead of program-centricly in the configuration file. I could even see cloud-based solutions for keeping your qwitter database synched. Q version 0.61: UPX some dll files down to cut down on final size. Q version 0.60: Make the executable building process more automated. Q version 0.59: Removed Embedded configobj, install from dependencies. Q version 0.58: Made the configuration dialog a little more useful as now it sets its own values. Observe the sample in interface.py, and to show the config dialog, use currently control+win+o. Multiuser functionality will need to be addressed for this to be a truly safe feature. jhsw version 0.57: Added screen reader selection. Removed asociated todo from todo list. Q version 0.56: A bit more logging, no more 1 days Q version 0.55: Better handling of corrupt or otherwise incomplete keymaps. Better as in they don't crash the damned thing now. Q version 0.54: Squish the database thread issue once and for all, maybe? Fix up time management. Q version 0.53: Announce number of unread messages when you switch to a buffer. Controlled by Daiverd's earlier config option. Announce active buffer on startup. Daiverd version 0.52: readBufferLength is a settable conf option with default of true Daiverd version 0.51: Speak number of tweets in buffer when cycling. Added ctrl+win+v currently opens new tweet with the tweet text inside. Not pretty. Working on a better solution. Q version 0.50: Fix new dm sound. Make buffer cyclic. Q version 0.49: Upgrade to Twitter API from svn. Q version 0.48: Switch to three tables for holding tweets, replies, and direct messages separately. Added buffer system. It is critical that you delete your qwitter.db and qwitter.conf before running this new version. It would also be a good idea to install the new twitter api from the dependencies folder. Also fixed the 1 minute bug. Q version 0.47: Make passwords harder to steal out of the configuration file. Don't try setting the cache limit, let the API handle it. WARNING WARNING WARNING! You must delete your qwitter.conf and recreate! Q version 0.46: Added some more logging, by default don't have names for @replies selected so you can just type. mattc version 0.45: Added System Access support. Q version 0.44: Move logging into its own file, use like from log import logging, then call the standard methods on it -- .debug, .info, etc. Also increased the twitter API cache limit in an attempt to avoid http 400 rate limiting. Daiverd version 0.43: quit qwitter works by killing it's own process, a bit morbit, but it works. Check bugs.txt Q version 0.42: The beginnings of implimenting logging support. Q version 0.41: Support grabbing direct messages. Currently they're just treated like tweets. Need an infrastructure change for anything different. Q version 0.40: Update setup.py to copy essential configuration files into a new build. Still trying to figure out how to get sounds in. Daiverd version 0.39: changed the newTweet dialog to update it's title with number of typed chars. Changed newtweet dialog to react to textupdated events instead of keypress events which gives an accurate text length everytime Daiverd version 0.38: cleanup, killing wmi and such. Daiverd version 0.37: cleanup, killing wmi and such. Daiverd version 0.36: cleanup, killing wmi and such. Daiverd version 0.35: Redid code so qwitters kills running version and loads new one works fine in vista. No multiple qwitters! Need to add a startup and restart sound. There is something messed up with a module that is loading that still prevents qwitter from closing via the close keystroke Daiverd version 0.34: Added code to qwitter.pyw using WMI to check if the pid in conf is running, if so, terminate and continue loading. Currently commented out due to access denied in vista. Something is keeping the program from closing completely please check. Daiverd version 0.33: hotkey to quit qwitter ctrl+windows+q with yes/no dialogue, added pid to qwitter.conf for later program checking/restarting Q version 0.32: Hotkey and function to toggle automatic speaking of tweets. Currently control+win+s Q version 0.31: Add a way to list URLs in a tweet and visit them. Currently control+win+b Q version 0.30: Add $when as a usable variable in templates. Will return how along ago a tweet was posted. Daiverd version 0.29: forced the new tweet dialogue to have a size so that you can read the whole tweet Q version 0.28: Sound on posting tweet. Q version 0.27: Use pysqlite again. Q version 0.26: If they start typing too much, alert them. Q version 0.25: If we have an empty database, correctly set the maxIndex. Added speak function, added update tweets function, assigned to key. Set the twitter API cache to 10 seconds. Q version 0.24: Added error checking to the check interval, made it able to go to 1 minute minimum. jhsw version 0.23: Changed checkInterval to a spin control. Q version 0.22: $name should be tweet[2]... Added reply function and corresponding keystroke. jhsw version 0.21: I lied; todo wasn't actually removed. It is now. Sorry. jhsw version 0.20: Added "check interval" to config dialog. Removed corresponding todo. Q version 0.19: Basic setup.py for building exe. Bootstrap better from a clean launch. Don't require restarting after first start. Executable builds. Q version 0.18: Update readme, make the new tweet dialog actually respect the cancel button... Add a check for length into the posting process, if too long bring the dialog back up with *all of the previous text. Q version 0.17: Add new tweet navigation options, Improve tweet navigation, update todos. Q version 0.16: Added a NewestTweets function, modified SpeakTweet to take an index, added boundary sound. Stop speech from speaking when it's initialized because it actually does have to initialize twice. Q version 0.15: Rename qwitter.py to qwitter.pyw. Fix speech initializing twice. Q version 0.14: Add index to configuration. Remove debugging code. Add sounds, support soundpacks. Q version 0.13: Initial global hotkey support. Add hotkeys by creating a function in interface.py, then in keymap.conf use that function like function="hotkey" I.E. NewTweet="control+win+n" Q version 0.12: Fixed the database threading issue. Q version 0.11: Got rid of some completed todos. Added the keymap to the config system. Q version 0.10: Incoming tweets are automatically spoken if configured. Added several configuration options for sounds to come later. Debugging code removed. Q version 0.9: Databases can now be created if they don't exist. I'll do the speech next. Q version 0.8: Added auto read tweets checkbox to dialogs.ConfigurationDialog, set it's value, will make it work in next version. Q version 0.7: Code modified a bit for database -- now confirms tweet, and some debugging display. Fixed up the imports to be more gooder. Q version 0.6: converted speech.py from the Mongoose Client into a standalone class. To use, do like import speech speaker=speach.speaker() It will auto-load the screen reader from config (or try to guess it) and you can talk to it with speaker.say(text) This requires pywin32, I built a copy for python 2.6 sans directx support (I could add if need later) and stuck it in dependencies for you guys. If using a different version of python, grab from http://sf.net/projects/pywin32 Q version 0.5: Several changes here. Database now has an id column which holds the int which is the tweet index. Nothing to do with twitter's tweet id. I know there's more but I can't remember what it is :P jhsw version 0.4: removed "at tweet[1]", as it was causing problems. Q version 0.3: Designed the TimedFullCheck function and set it up with CheckTweets (more to follow.) Also switched to storing unix timestamps. Q version 0.2: Moved the main timer out of the CheckTweets function so we can call that independently. Also wrote the beginnings of the NewTweet Dialog. Q version 0.1: Initial commit. Connects and retrieves tweets, stores them in db. Lots to do.