XaGenevaȜŀ tnLANDmac Changes 12/31/08; 7:15:53 AM by DW Do nothing. return //there has to be *something* here. :-) 6N5ŀ̡ 001user.instantOutlineVGeneva|=g.Mŀָ  )flUpdate onInstallX uninstallUVGeneva|= Ĥ7Ť}1 40Ĥ7Ĥ7 prefs4tpVĤ9ŵp  !9 E ŵp author Dave Winer authorEmaildave.winer@gmail.com descriptionJWorkgroup communication using an outline to reflect each person's status. homePageUrl@http://howto.opml.org/dave/editorOpmlOrg/instantOutlineTool.htmlnameinstantOutline releaseDateversion0.33t+BqGenevaŀŀ @PLANDmac on addBuddy (username) Changes 12/31/08; 8:07:46 AM by DW Created. if defined (user.instantOutline.users.[username]) scriptError ("Can't add the buddy \"" + username + "\" because there is already a buddy with that name.") else instantOutlineSuite.initUser (username) instantOutlineSuite.readUserOutline (username) bundle //test code addBuddy ("nicco") +fGenevaĤ8Ť|lByLANDmac Changes 1/27/09; 8:54:24 AM by DW While we're in active testing, update every hour. Later we may want to comment this and let builtins.opmlEditor do the updating once every night. frontier.tools.updateme (this) fGenevaĤ8šzc8LANDmac Changes 1/25/09; 8:06:49 AM by DW Created. instantOutlineSuite.init () if not defined (system.temp.instantOutline.flStarted) instantOutlineSuite.openMyOutline () system.temp.instantOutline.flStarted = true bundle //make sure the realtimeupdates thread is running local (flstart = true) if defined (system.temp.instantoutline.idRealtimeThread) flstart = thread.exists (system.temp.instantoutline.idRealtimeThread) if flstart thread.callscript (@instantOutlineSuite.getRealtimeUpdates, {}) Wdatatabl0GĦ1bĦ1b createdFri, 18 Jul 2008 18:39:14 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:14 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:33 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:27 GMTGenevaĤ8Ť}LANDmac This script runs every night. {w.Ĥ8Ť}  ". 9 everyHour everyMinuteS everyNight v{FGenevaħbŵeLANDmac on buddyUpdated (name) Changes 7/21/08; 8:58:41 AM by DW Beep on each update, subject to pref. Also fixed bug, atts.bold wasn't being set for an already-existing user. Wasn't calling op.attributes.addgroup. 7/19/08; 2:10:42 PM by DW Insert new buddies at the bottom, not the top. 7/19/08; 2:01:51 PM by DW Handle empty buddy outline (startup). 7/19/08; 9:22:55 AM by DW Created. Add the user to the buddy outline if not already there, bolden if there. on beep () if user.instantOutline.prefs.flBeepOnUpdate speaker.sound (1, 100, 5000) local (oldtarget = target.set (@user.instantOutline.buddyOutline)) local (oldcursor = op.getcursor (), flfound = false, atts) op.firstsummit () loop op.attributes.getall (@atts) if defined (atts.name) if atts.name == name flfound = true if not atts.bold op.setlinetext ("" + op.getlinetext () + "") atts.bold == true op.attributes.addgroup (@atts) //7/21/08 by DW beep () break if not op.go (down, 1) break if not flfound op.firstsummit () bundle //insert the new line local (s = "" + name + "") if op.getrefcon () == 0 //no atts op.setlinetext (s) else op.insert (s, down) new (tabletype, @atts) atts.name = name atts.type = "v2BuddyOutlineElement" atts.bold = true op.attributes.addgroup (@atts) beep () op.setcursor (oldcursor) target.set (oldtarget) bundle //test code buddyUpdated ("davew") WdatatablGħbħb createdSat, 19 Jul 2008 16:22:52 GMTWdatatablGĪAĪA createdMon, 21 Jul 2008 15:58:41 GMTWdatatablGĪBĪB createdMon, 21 Jul 2008 15:58:42 GMTWdatatablGĪOĪO createdMon, 21 Jul 2008 15:58:55 GMTWdatatablGħbħb createdSat, 19 Jul 2008 21:10:42 GMTWdatatablGħbħb createdSat, 19 Jul 2008 21:10:42 GMTWdatatablGħOħO createdSat, 19 Jul 2008 21:01:51 GMTWdatatablGħOħO createdSat, 19 Jul 2008 21:01:51 GMTWdatatablGħbħb createdSat, 19 Jul 2008 16:22:54 GMTWdatatablGħbħb createdSat, 19 Jul 2008 16:22:55 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:52:08 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:53:15 GMTWdatatablGĩSĩS createdMon, 21 Jul 2008 15:50:27 GMTWdatatablGħcBħcB createdSat, 19 Jul 2008 16:24:18 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:26 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:37 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:57 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:25 GMTWdatatablGħe ħe createdSat, 19 Jul 2008 16:31:53 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:42 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:27:05 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:27:23 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:27:32 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:27:11 GMTWdatatablGħe>ħe> createdSat, 19 Jul 2008 16:32:46 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:53:28 GMTWdatatablGħd ħd createdSat, 19 Jul 2008 16:28:00 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:59 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:04 GMTWdatatablGħd1ħd1 createdSat, 19 Jul 2008 16:28:17 GMTWdatatablGħd5ħd5 createdSat, 19 Jul 2008 16:28:21 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:00:18 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:00:34 GMTWdatatablGħ ħ createdSat, 19 Jul 2008 21:00:42 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:00:49 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:00:57 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:00:58 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:29:59 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:30:23 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:30:28 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:30:34 GMTWdatatablGħe>ħe> createdSat, 19 Jul 2008 16:32:46 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:53:28 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:06 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:14 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:31:04 GMTWdatatablGħdħd createdSat, 19 Jul 2008 16:31:07 GMTF;GenevaLħp;2LANDmac thread.callScript (@instantOutlineSuite.openMyOutline, {}) 2GenevaLŵ?2LANDmac Changes 2/9/09; 11:15:01 AM by DW Created. New button in Buddies window completely refreshes. thread.callScript (@instantOutlineSuite.refreshBuddyOutline, {}) 2 yGenevaıŀ;2pLANDmac Changes 7/19/08; 10:21:34 AM by DW Created. thread.callScript (@webbrowser.openurl, {instantOutlineInfo.homePageUrl})  .TŵC  1= N00002000 My Outline0$00003000 Refresh0%00004000 Support0&VArial 9-8Geneva<Ħ0- A.LANDmac thread.callscript (@instantOutlineSuite.saveButton, {}) oGeneva<Ũ}7@@&LANDmac Changes 1/30/09; 11:43:33 AM by DW The code in this script was moved to a separate script so it can be called in a thread. thread.callscript (@instantOutlineSuite.newEntry, {}) WdatatablGĪTĪT createdMon, 21 Jul 2008 21:56:07 GMT>GenevaLħp]>2LANDmac thread.callScript (@instantOutlineSuite.openBuddyOutline, {})  yGenevaıŀ>2pLANDmac Changes 7/19/08; 10:21:34 AM by DW Created. thread.callScript (@webbrowser.openurl, {instantOutlineInfo.homePageUrl})   8<ŨK  -9 JV g 00001000 Save0)00002000 New Entry0)00003000 Buddies0+j00004000 Support0,2VArial 2% V$Tž<  " buddyWindow( myOutline-GVArial s:R` Ĥ8Ĥ8 Ĥ8Ĥ8 Ĥ8Ĥ8 nj.Ĥ8Ĥ8  ' ,fileMenu/radio/Duser/pnh>GenevaħħGLANDmac InstantOutline Getting started Thanks for your interest in the instant outliner project. 1. Launch the OPML Editor if it's not already running. Choose Update opml.root from the File menu to get the latest code. 2. Quit the OPML Editor. 3. Download the root file and save it in the Tools sub-folder of the OPML Editor. (It's located in Guest Databases/Apps.) 4. Launch the OPML Editor. Your outline window will open as will the preferences table. You must enter a valid identi.ca username and password before you can participate. To update, click on New Note, and enter a headline, a list, indent as much or as little as you like. The organization is entirely up to you. Pick up ideas from others as you go, you'll get better at it. Click on Buddies to see what other people in your workgroup are doing. If you have questions or comments post a note here. Jdatatabl:$ħħ ħ changenumcreatedWdatatablGħħ createdSat, 19 Jul 2008 21:26:06 GMTWdatatablGħPħP createdSat, 19 Jul 2008 21:44:32 GMTWdatatablGħvħv createdSat, 19 Jul 2008 21:45:10 GMTWdatatablGħwħw createdSat, 19 Jul 2008 21:28:07 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:28:42 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:29:28 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:30:40 GMTWdatatablGħ&ħ& createdSat, 19 Jul 2008 21:31:02 GMTh|"ŤŤiouVGeneva|=|c$Ĥť$  #appnameinstantOutlineroomnameinstant-outline-betaVGeneva 2O.ĦŠ 3 ; ioserver&xmlrpc://instantrpc.opml.org:5337/RPC2support@http://howto.opml.org/dave/editorOpmlOrg/instantOutlineTool.htmlusername7http://127.0.0.1:5337/opmlEditor/prefs?title=friendfeedVGenevaiZcOtGeneva F 2 LANDmac on finalFilter (pta) pta^.renderedText = string.replace (pta^.renderedText, "[[title]]", "") return (true) ����������������������������� ���-����Geneva���������������������������� ��������������Eu �������2 LAND������mac ������������on firstFilter (adrPageTable) return (true) �����������������������*��[����Geneva���������������������������� ��������������Eu ���y���}�2'LAND������mac ������������on pageFilter (pta) if typeOf (pta^.template) == outlineType or typeOf (pta^.template) == wpTextType table.assign (@pta^.template, string (pta^.template)) if typeOf (pta^.template) == stringType and not pta^.indirectTemplate pta^.template = string.replace (pta^.template, "<title>", "[[title]]") html.addPageToGlossary (pta) return (true) �����������������������������������������������y���.���EF�������� ���� ��� ����$���0 ����; finalFilter������:6 firstFilter������;@ pagefilter������;��VGeneva���������������������������� �����������G�N��)�����������������������������������F������7ů|N�������� ����url��� http://127.0.0.1/instantOutline/��VGeneva���������������������������� �����������A��'��������������������������������������$���ů|ů|�������� ���� ��� ����linetext���}["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:instantOutline.root"].instantOutlineWebsite.changeRoompath���changeRoom.wsf������O�������K���$���ůvův�������� ���� ��� ����linetext���Homepath��� index.wsf���O������������$�������ů|�������� ����~��� ����}["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:instantOutline.root"].instantOutlineWebsite.changeRoom������?Home������@j��VArial����������������������������� ���������������������������������������������������������W����������������������space���/GIFfGIF89a�������!����,�������D�;��VArial����������������������������� ������������������������������������������������������������V��������������� ������� �������"�������+ ����0���: ����C���L ����Q���[ ����aalink���008000bgcolor���FFFFFFflRenderlink���0000FFspaceGif���spacetext���000000vlink���800080��VArial����������������������������� �������������������������������������������������d��������<��������Geneva���������������������������� ��������������F ������z�*LAND������mac ������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>{title} {metaTags ()} {bodyTag ()} {bodytext} dn8>VArial nnlGenevaůxů|,VrLANDmac Changes 2/4/09; 4:54:32 PM by DW Created. local (pta = html.getpagetableaddress (), args) scratchpad.params = pta^ new (tabletype, @args) webserver.parseargs (pta^.searchargs, @args) scratchpad.args = args; edit (@scratchpad.args) frontier.bringtofront () thread.callscript (@instantOutlineSuite.menuCommands.changeRoom, {args.name}) bundle //redirect if defined (pta^.requestHeaders.Referer) local (url = pta^.requestHeaders.Referer) pta^.code = 302 //temporary redirect pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = url pta^.responseHeaders.URI = url return ("") nFFFF000000060001001777AA000000000063000000001001710000001-767F6FFE18000004800480626200-10626222FFFF01030000100000031000000010E840626222E048E000166266000020000001200000000E,#title "Home" 000400000009000000020100000500000009000000020100000600000032000000010C310FFFF0C00000 20 000700000019000000010201600008000000A50000000140,Geneva40,1040304E40101000090000001500000002393174393174000A0000001500000002626222626222000B00000005000000020000C00000013000000010369AF101000F0000005200000000400 10 4,appn4,send4,84,&4,84,34,800130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAPĵ7 6%'j7ůx  * 4@ HT [g q} #filters>#ftpSite> #glossary@#imagesA#prefsB #templateC#toolsEF changeRoomEindexI:VGeneva vOx?+8ĤKů#  !- 2> F specialUsers7strings8urls8websiteMVGeneva 2 GenevaŤ.ŵ+F%LANDmac on discoverBuddies () Changes 2/9/09; 11:01:49 AM by DW If a user is a member of the room but has never updated their outline (as quite a few are just lurking), it won't screw up the discovery process. 2/7/09; 1:58:07 PM by DW Call instantOutlineSuite.getAllUserOutlineUrls to get the outline urls. It's not optimized. With about 30 users the call takes about 1/2 second from Berkeley. We were getting incorrect URLs showing up. Rather than figure out why -- just get them all. 2/4/09; 10:24:00 AM by DW Comment debugging code. 2/4/09; 9:33:39 AM by DW Try a different method of buddy discovery. 1. Call FriendFeed.getRoomProfile to get a list of members of the room. 2. For the members we don't know about, send a message to the server asking for the urls of their outlines. 3. Each of those that have urls get added. 2/3/09; 10:56:03 AM by DW Use the parameterized roomname, not the fixed one. 1/28/09; 9:21:23 AM by DW Make parsing of updates more rigorous. 1/27/09; 11:11:07 AM by DW Comment debugging code. 1/27/09; 9:32:50 AM by DW Called shortly after startup, it looks for buddies you don't already know about who may have joined while the OPML Editor wasn't running. local (adrdata = instantOutlineSuite.init ()) local (server = instantOutlineSuite.data.urls.ioserver) local (username, password, roomname = user.instantOutline.prefs.roomName) instantOutlineSuite.getUserNameAndPassword (@username, @password) bundle //new method -- 2/4/09 by DW local (profile, members, adr) FriendFeed.getRoomProfile (roomname, @profile, username, password) scratchpad.roomprofile = profile for adr in @profile.members instantOutlineSuite.initUser (nameof (adr^)) //make sure a table exists for every member instantOutlineSuite.getAllUserOutlineUrls () //2/7/09 by DW for adr in @adrdata^.users if adr^.fldirty //it's new if adr^.outlineurl != "" instantOutlineSuite.readUserOutline (nameof (adr^)) adr^.fldirty = false bundle //old way of getting outline urls, 2/7/09 by DW new (tabletype, @members) for adr in @profile.members local (name = nameof (adr^)) if not defined (user.instantoutline.users.[name]) members.[name] = "" members = [server].instantOutlineServer.getMemberUrls (members) scratchpad.filledmemberstable = members for adr in @members if adr^ != "" //server filled in the url local (name = nameof (adr^), adruser = instantOutlineSuite.initUser (name)) adruser^.outlineurl = adr^ thread.callscript (@instantOutlineSuite.readUserOutline, {name}) bundle //old method -- 2/4/09 by DW local (updates, adrupdate) FriendFeed.getUserUpdates (roomname, @updates, flRoom:true, username:username, remotekey:password) scratchpad.updates = updates for adrupdate in @updates local (title = adrupdate^.title) local (verb = string.trimwhitespace (string.nthfield (title, ":", 1))) local (noun = string.trimwhitespace (string.nthfield (title, ":", 2))) case verb "updated" local (adruser = instantOutlineSuite.initUser (noun)) if not defined (adruser^.outlineurl) //it's new adruser^.outlineurl = adrupdate^.link thread.callscript (@instantOutlineSuite.readUserOutline, {noun}) bundle //test code discoverBuddies () Wdatatabl0GĦĦ createdFri, 18 Jul 2008 16:58:10 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:54:50 GMTWdatatabl0GĦAĦA createdSat, 19 Jul 2008 04:01:53 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatabl0GĦAĦA createdSat, 19 Jul 2008 04:01:53 GMT GenevaųBkŵ LANDmac on getAllUserOutlineUrls () Changes 2/7/09; 2:00:58 PM by DW Maintain user.instantOutline.stats.ctGetAllUserOutlineUrls. 2/7/09; 1:52:19 PM by DW Created. A sure-fire way of getting all the urls of all the users' outlines. local (adrdata = instantoutlinesuite.init (), members, memberurls) local (server = instantOutlineSuite.data.urls.ioserver, adruser, adrmember) new (tabletype, @members) for adruser in @adrdata^.users members.[nameof (adruser^)] = true memberurls = [server].instantOutlineServer.getMemberUrls (members) scratchpad.members = members scratchpad.memberurls = memberurls for adrmember in @memberurls local (adruser = @adrdata^.users.[nameof (adrmember^)]) adruser^.outlineUrl = adrmember^ user.instantOutline.stats.ctGetAllUserOutlineUrls++ bundle //test code local (tc = clock.ticks ()) getAllUserOutlineUrls () dialog.alert (clock.ticks () - tc) Wdatatabl0GĦĦ createdFri, 18 Jul 2008 16:54:50 GMT] Y GenevaĤŭӃ*gLANDmac on getRealtimeUpdates () Changes 2/3/09; 10:56:03 AM by DW Use the parameterized roomname, not the fixed one. 1/1/09; 7:08:38 PM by DW Massive change -- we no longer poll. Instead we use FriendFeed's realtime updates capability. Much more responsive, and less of a resource hog. Total win-win. 7/21/08; 5:58:03 AM by DW Add stats for tracking how long calls to FF take. 7/19/08; 2:48:41 PM by DW Don't process updates from "davewiner" and "bullmancuso" -- these are just temporary limits, until we safe-up everything for users who don't exist anymore (they became dave and bull). 7/19/08; 1:37:15 PM by DW When processing updates, just set the dirty bits on the users, read the outlines after the loop. This way if someone updates twice we only read once. 7/16/08; 8:07:40 PM by DW Created. local (username, remotekey) system.temp.instantoutline.idRealtimeThread = thread.getcurrentid () instantOutlineSuite.getUserNameAndPassword (@username, @remotekey) on callback (adrentry) local (title = xml.getvalue (adrentry, "title"), now = clock.now ()) scratchpad.entry = adrentry^ user.instantOutline.stats.ctLastRealtimeUpdate++ user.instantOutline.stats.whenLastRealtimeUpdate = now local (verb = string.trimwhitespace (string.nthfield (title, ":", 1))) local (noun = string.trimwhitespace (string.nthfield (title, ":", 2))) case verb "updated" local (adruser = instantOutlineSuite.initUser (noun)) adruser^.outlineUrl = xml.getvalue (adrentry, "link") adruser^.stats.ctUpdates++ adruser^.stats.whenLastUpdate = now thread.callscript (@instantOutlineSuite.readUserOutline, {noun}) FriendFeed.getRealTimeUpdates (username, remotekey, @callback, room:user.instantOutline.prefs.roomName) bundle //old code local (appname = instantOutlineSuite.data.strings.appname, tc = clock.ticks (), updates, adr, adruser) FriendFeed.getUserUpdates (username, @updates, true, appname) bundle //track ticks for updates user.instantOutline.stats.ctTicksGetUpdates = user.instantOutline.stats.ctTicksGetUpdates + (clock.ticks () - tc) user.instantOutline.stats.ctGetUpdates++ scratchpad.updates = updates; edit (@scratchpad.updates) for adr in @updates local (verb = string.trimwhitespace (string.nthfield (adr^.title, ":", 1))) local (noun = string.trimwhitespace (string.nthfield (adr^.title, ":", 2))) case verb "updated" if defined (user.instantOutline.users.[noun]) local (adruser = instantOutlineSuite.initUser (noun)) adruser^.whenLastUpdate = clock.now () adruser^.flDirty = true for adruser in @user.instantOutline.users if adruser^.flDirty thread.callscript (@instantOutlineSuite.readUserOutline, {nameof (adruser^)}) adruser^.flDirty = false user.instantOutline.stats.ctPolls++ user.instantOutline.stats.whenLastPoll = clock.now () bundle //test code getRealtimeUpdates () WdatatablGĤĤ createdThu, 17 Jul 2008 03:07:37 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 12:58:03 GMTWdatatablGĩsĩs createdMon, 21 Jul 2008 12:47:31 GMTWdatatablGħIħI createdSat, 19 Jul 2008 21:48:41 GMTWdatatablGħIħI createdSat, 19 Jul 2008 21:48:41 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:37:14 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:37:15 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:07:39 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:07:40 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:16 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:18 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:21 GMTWdatatablGĤ MĤ M createdThu, 17 Jul 2008 03:27:57 GMTWdatatabl0GĦAĦA createdSat, 19 Jul 2008 04:01:53 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:18:09 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:16:32 GMTWdatatablGĩhĩh createdMon, 21 Jul 2008 12:51:36 GMTWdatatablGĩpĩp createdMon, 21 Jul 2008 12:51:44 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:18:34 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:22:19 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatablGĤ kĤ k createdThu, 17 Jul 2008 03:24:11 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:16 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:18 GMTWdatatablGħ6ħ6 createdSat, 19 Jul 2008 21:48:22 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:21 GMTWdatatablGĤ MĤ M createdThu, 17 Jul 2008 03:27:57 GMTWdatatablGĤ WĤ W createdThu, 17 Jul 2008 03:28:07 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:38:14 GMTWdatatablGĤ WĤ W createdThu, 17 Jul 2008 03:28:07 GMTWdatatabl0GĦAĦA createdSat, 19 Jul 2008 04:01:53 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:39:43 GMTWdatatablGĤ!Ĥ! createdThu, 17 Jul 2008 03:18:41 GMTWdatatablGĤ%Ĥ% createdThu, 17 Jul 2008 03:18:45 GMT]fGenevaşX6Ť qLANDmac on getUserNameAndPassword (adrusername, adrpassword=nil, id=nil) Changes 1/27/09; 1:42:47 PM by DW If id is not nil, return a string suitable for the ownerId element in an OPML header. http://www.opml.org/spec2#whatIsALtheadgt 1/23/09; 11:20:13 AM by DW Created. Return the username and password, makes it easy to change the identity system from whatever it is to something else. To begin it's FriendFeed. FriendFeed.init () adrusername^ = user.FriendFeed.prefs.username if adrpassword != nil adrpassword^ = user.FriendFeed.prefs.remoteKey if id != nil //1/27/09 by DW id^ = "http://friendfeed.com/" + user.FriendFeed.prefs.username bundle //test code local (username, password) getUserNameAndPassword (@username, @password) dialog.alert (username + " + " + password) $& GenevaĤQųE:BjYLANDmac Changes 2/7/09; 1:59:54 PM by DW Init user.instantOutline.stats.ctGetAllUserOutlineUrls. 2/4/09; 5:14:00 PM by DW Init the flags table, re-install front tool so new website will be recognized w/o having to restart editor. 2/3/09; 10:48:42 AM by DW Make the room name a pref, default to "instant-outline-beta." 1/28/09; 8:47:56 AM by DW Delete instantOutlineSuite.server.data if it exists. 1/27/09; 9:02:45 AM by DW Delete the everyMinute script if it's already installed. 1/27/09; 9:00:00 AM by DW No longer install an everyMinute script -- we have a full featured thread running. 12/31/08; 8:38:44 AM by DW No longer store username/password in prefs here, we're using an identi.ca login, so use the pref stored there. This makes it possible for us to use the builtin UI for setting the name and password. 7/21/08; 8:52:50 AM by DW Init user.instantOutline.prefs.flBeepOnUpdate. 7/21/08; 5:47:31 AM by DW Add stats for tracking how long calls to FF take. if not defined (user.instantOutline) new (tabletype, @user.instantOutline) if not defined (user.instantOutline.myOutline) new (outlinetype, @user.instantOutline.myOutline) if not defined (user.instantOutline.buddyOutline) new (outlinetype, @user.instantOutline.buddyOutline) bundle //prefs if not defined (user.instantOutline.prefs) new (tabletype, @user.instantOutline.prefs) if not defined (user.instantOutline.prefs.username) user.instantOutline.prefs.username = "" if not defined (user.instantOutline.prefs.password) user.instantOutline.prefs.password = "" if not defined (user.instantOutline.prefs.outlineUrl) user.instantOutline.prefs.outlineUrl = "" if not defined (user.instantOutline.prefs.ctMinutesBetwUpdates) user.instantOutline.prefs.ctMinutesBetwUpdates = 10 if not defined (user.instantOutline.prefs.windowFont) user.instantOutline.prefs.windowFont = "geneva" if not defined (user.instantOutline.prefs.windowFontSize) user.instantOutline.prefs.windowFontSize = 14 if not defined (user.instantOutline.prefs.flBeepOnUpdate) user.instantOutline.prefs.flBeepOnUpdate = true if not defined (user.instantOutline.prefs.lastNewBuddyName) user.instantOutline.prefs.lastNewBuddyName = "" if not defined (user.instantOutline.prefs.roomName) //2/3/09 by DW user.instantOutline.prefs.roomName = "instant-outline-beta" bundle //stats if not defined (user.instantOutline.stats) new (tabletype, @user.instantOutline.stats) if not defined (user.instantOutline.stats.ctSaves) user.instantOutline.stats.ctSaves = 0 if not defined (user.instantOutline.stats.ctPolls) user.instantOutline.stats.ctPolls = 0 if not defined (user.instantOutline.stats.whenLastUpdate) user.instantOutline.stats.whenLastUpdate = date (0) if not defined (user.instantOutline.stats.ctUpdates) user.instantOutline.stats.ctUpdates = 0 if not defined (user.instantOutline.stats.ctGetUpdates) user.instantOutline.stats.ctGetUpdates = 0 if not defined (user.instantOutline.stats.ctTicksGetUpdates) user.instantOutline.stats.ctTicksGetUpdates = 0 if not defined (user.instantOutline.stats.ctLastRealtimeUpdate) user.instantOutline.stats.ctLastRealtimeUpdate = 0 if not defined (user.instantOutline.stats.ctGetAllUserOutlineUrls) user.instantOutline.stats.ctGetAllUserOutlineUrls = 0 bundle //flags if not defined (user.instantOutline.flags) new (tabletype, @user.instantOutline.flags) if not defined (user.instantOutline.flags.websiteInstall) //2/4/09 by DW try local (x = string.parseAddress (this), f = x [1]) frontier.tools.install (f) user.instantOutline.flags.websiteInstall = clock.now () if not defined (user.instantOutline.flags.websiteInstall2) //2/4/09 by DW user.webserver.responders.websiteFramework.data.docTree.instantOutline = @instantOutlineWebsite user.instantOutline.flags.websiteInstall2 = clock.now () if not defined (user.instantOutline.flags.websiteInstall3) //2/4/09 by DW local (x = string.parseAddress (this), f = x [1]) local (adrwebsite = @[f].instantOutlineWebsite) if not defined (adrwebsite^) adrwebsite^ = instantOutlineSuite.data.website user.webserver.responders.websiteFramework.data.docTree.instantOutline = @instantOutlineWebsite user.instantOutline.flags.websiteInstall3 = clock.now () if not defined (user.instantOutline.flags.fixOutlineUrls) //2/7/09 by DW user.instantOutline.flags.fixOutlineUrls = clock.now () //this has to be done first, getAllUserOutlineUrls calls init! :-) instantOutlineSuite.getAllUserOutlineUrls () if not defined (user.instantOutline.users) new (tabletype, @user.instantOutline.users) bundle //misc if defined (user.scheduler2.everyminute.instantOutline) //1/27/09 by DW delete (@user.scheduler2.everyminute.instantOutline) if not defined (user.scheduler2.everyminute.instantOutline) //1/27/09 by DW -- commented user.scheduler2.everyminute.instantOutline = @instantOutlineSuite.everyMinute if not defined (Frontier.tools.data.nodeTypes.v2BuddyOutlineElement) Frontier.tools.data.nodeTypes.v2BuddyOutlineElement = @instantOutlineSuite.nodeTypes.v2BuddyOutlineElement if not defined (system.temp.instantOutline) new (tabletype, @system.temp.instantOutline) if defined (instantOutlineSuite.server.data) //1/28/09 by DW delete (@instantOutlineSuite.server.data) return (@user.instantOutline) WdatatablGĩnĩn createdMon, 21 Jul 2008 12:47:26 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:52:49 GMTWdatatablGĩĩ createdMon, 21 Jul 2008 15:52:50 GMTWdatatablGĩqĩq createdMon, 21 Jul 2008 12:47:29 GMTWdatatablGĩsĩs createdMon, 21 Jul 2008 12:47:31 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatabl0GĦ1Ħ1 createdFri, 18 Jul 2008 18:37:41 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatabl0GĦ1Ħ1 createdFri, 18 Jul 2008 18:37:41 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTWdatatabl0GĦ2 Ħ2 createdFri, 18 Jul 2008 18:42:03 GMTWdatatabl0GĦ2Ħ2 createdFri, 18 Jul 2008 18:42:07 GMTWdatatabl0GĦ2Ħ2 createdFri, 18 Jul 2008 18:42:23 GMTWdatatabl0GĦ2Ħ2 createdFri, 18 Jul 2008 18:42:07 GMTWdatatabl0GĦ2Ħ2 createdFri, 18 Jul 2008 18:42:23 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:51:46 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:51:55 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:51:10 GMT$&  xGenevaĤ šfLANDmac on initUser (username) local (adruser = @user.instantOutline.users.[username]) if not defined (adruser^) new (tabletype, adruser) adruser^.flDirty = true if not defined (adruser^.outlineurl) local (server = instantOutlineSuite.data.urls.ioserver) try adruser^.outlineUrl = [server].instantOutlineServer.getOutlineUrl (username) bundle //stats if not defined (adruser^.stats) new (tabletype, @adruser^.stats) if not defined (adruser^.stats.ctReads) adruser^.stats.ctReads = 0 if not defined (adruser^.stats.ctUpdates) adruser^.stats.ctUpdates = 0 if not defined (adruser^.stats.whenLastUpdate) adruser^.stats.whenLastUpdate = date (0) if not defined (adruser^.stats.whenCreated) adruser^.stats.whenCreated = clock.now () if not defined (adrUser^.stats.ctTicksOutlineRead) adrUser^.stats.ctTicksOutlineRead = 0 if not defined (adrUser^.stats.ctTicksOutlineCompile) adrUser^.stats.ctTicksOutlineCompile = 0 return (adruser) bundle //test code initUser ("davew") WdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:26:16 GMTWdatatablGĤ Ĥ createdThu, 17 Jul 2008 03:25:21 GMTWdatatablGĤ Ĥ  createdThu, 17 Jul 2008 03:26:46 GMTWdatatablGĤ WĤ W createdThu, 17 Jul 2008 03:28:07 GMTWdatatabl0GĦ7AĦ7A createdFri, 18 Jul 2008 19:04:17 GMTWdatatabl0GĦ7Ħ7 createdFri, 18 Jul 2008 19:03:42 GMTWdatatabl0GĦ7Ħ7 createdFri, 18 Jul 2008 19:05:25 GMTWdatatabl0GĦ6Ħ6 createdFri, 18 Jul 2008 19:02:46 GMTWdatatabl0GĦoĦo createdSat, 19 Jul 2008 03:58:23 GMTWdatatabl0GĦ1Ħ1 createdSat, 19 Jul 2008 03:57:21 GMTWdatatabl0GĦ9Ħ9 createdSat, 19 Jul 2008 03:57:29 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatabl0GĦyĦy createdSat, 19 Jul 2008 03:58:33 GMTWdatatabl0GĦ~Ħ~ createdSat, 19 Jul 2008 03:58:38 GMTWdatatablGĤ -Ĥ - createdThu, 17 Jul 2008 03:27:25 GMTWdatatabl0GĦ74Ħ74 createdFri, 18 Jul 2008 19:04:04 GMTWdatatabl0GĦ7:Ħ7: createdFri, 18 Jul 2008 19:04:10 GMT 4GenevaTŀܹŀLANDmac webbrowser.openurl (instantOutlineInfo.homePageUrl) %GenevaĤ8ħ_$LANDmac instantOutlineSuite.openMyOutline () (GenevaTŀuŀzLANDmac instantOutlineSuite.openBuddyOutline () /GenevaTŭMŭULANDmac instantOutlineSuite.menuCommands.changeRoom () 8GenevaTŨMŨLANDmac Changes 1/30/09; 10:20:18 AM by DW Created. file.surefilepath (user.instantOutline.server.folder + "xxx") file.openfolder (user.instantOutline.server.folder) 8<GenevaTŀaŀ܉LANDmac webbrowser.openurl (instantOutlineSuite.data.urls.username) osGenevaĤ8ŭ԰LANDmac InstantOutline Howto... - My Outline Buddies - Change room... - Server Open folder - Username/password v % opwGeneva4Lp$Genevaŀŀ.LANDmac Changes 12/31/08; 8:08:28 AM by DW Created. instantOutlineSuite.init () if dialog.ask ("Buddy's username?", @user.instantOutline.prefs.lastNewBuddyName) instantOutlineSuite.addBuddy (user.instantOutline.prefs.lastNewBuddyName) F GenevaŭԼů} )guLANDmac on changeRoom (roomname=user.instantOutline.prefs.roomName) Changes 2/4/09; 4:57:30 PM by DW Add optional parameter so caller can suggest the default room name. 2/3/09; 11:29:28 AM by DW Created. Prompt the user for the name of the new room, and if authentication works, switch to that room. if dialog.ask ("FriendFeed room to use for workgroup?", @roomname) try local (profile, username = user.FriendFeed.prefs.username, password = user.FriendFeed.prefs.remoteKey) FriendFeed.getRoomProfile (roomname, @profile, username, password) user.instantOutline.prefs.roomName = roomname new (outlinetype, @user.instantOutline.buddyOutline) new (tabletype, @user.instantOutline.users) //2/4/09 by DW thread.kill (system.temp.instantOutline.idRealtimeThread) //has to start watching new room instantOutlineSuite.openBuddyOutline () thread.callscript (@instantOutlineSuite.discoverBuddies, {}) else scriptError ("Can't change to \"" + roomname + "\" because it doesn't exist or you don't have access.") WdatatablGĤ`Ĥ` createdThu, 17 Jul 2008 02:49:52 GMTFnHGenevaŵAŵnX);LANDmac on sendToTwitter () Changes 2/9/09; 2:10:45 PM by DW Created. Sends the cursor text to Twitter. local (s = op.getlinetext ()) if sizeof (s) == 0 scripterror ("Can't send to Twitter because the cursor headline is empty.") local (linkbegin = "http://") if string.lower (s) contains linkbegin local (ix = string.patternmatch (linkbegin, string.lower (s)), ixend = sizeof (s)) for i = ix to sizeof (s) if s [i] == " " ixend = i-1 break local (link = string.mid (s, ix, ixend - ix + 1)) s = string.delete (s, ix, sizeof (link)) link = bitly.create (link) s = string.insert (link, s, ix) if sizeof (s) > 140 dialog.alert ("Can't send to Twitter because there are " + sizeof (s) + " characters and I think we both know the limit is 140.") return twitter.init () if (sizeof (user.twitter.prefs.username) == 0) or (sizeof (user.twitter.prefs.password) == 0) dialog.alert ("Can't send to Twitter because the username and/or password have not been set.") return if dialog.ask ("Send to Twitter?", @s) twitter.newpost (s) bundle //test code sendToTwitter () nx.ŀŵA  , :addBuddy changeRoom! sendToTwittersVGeneva|=vGeneva<ŨB8y(_LANDmac on newEntry () Changes 1/30/09; 11:42:28 AM by DW Moved from the button script so it can be called in its own thread. Doing all that window manipulation from a button script is not something the kernel can handle. 1/30/09; 11:26:07 AM by DW Check with instantOutlineSuite.newerOutlineCheck before adding the new entry. 7/21/08; 2:56:12 PM by DW Instead of putting the user's name in quotes, bold face it, and capitalize the first character. if instantOutlineSuite.newerOutlineCheck () local (name) op.firstsummit () instantOutlineSuite.getUserNameAndPassword (@name) if string.isalpha (name [1]) name [1] = string.upper (name [1]) name = "" + name + "" op.insert (clock.now () + " by " + name + "", up) op.insert ("", right) wp.settextmode (true) WdatatablGĪTĪT createdMon, 21 Jul 2008 21:56:07 GMTWdatatablGĪT ĪT createdMon, 21 Jul 2008 21:56:10 GMTWdatatablGĪT ĪT createdMon, 21 Jul 2008 21:56:13 GMTWdatatablGĪSĪS createdMon, 21 Jul 2008 21:54:03 GMTWdatatablGĪSĪS createdMon, 21 Jul 2008 21:54:14 GMTWdatatablGĪSĪS createdMon, 21 Jul 2008 21:54:37 GMT8GenevaŨ>Ũ :LANDmac on newerOutlineCheck () Changes 1/30/09; 10:26:24 AM by DW Created. Call up to the server to see if there's a newer version of the outline, warn the user if so. Return true if you should proceed, false if the user cancelled. local (server = instantOutlineSuite.data.urls.ioserver, adroutline = @user.instantOutline.myOutline, username) instantOutlineSuite.getUserNameAndPassword (@username) local (when = [server].instantOutlineServer.getOutlineModified (username)) if when > timemodified (adroutline) case dialog.yesnocancel ("The published outline is newer. Use it instead?") 1 //Yes local (s = tcp.httpreadurl (user.instantOutline.prefs.outlineUrl)) window.close (adroutline) op.xmltooutline (s, adroutline) instantOutlineSuite.openMyOutline () return (true) //keep going 2 //No return (true) //keep going 3 //Cancel return (false) //"Stop! I want to think about this..." says the user. else return (true) //no problemmo, keep going bundle //test code newerOutlineCheck () Wdatatabl0GĦĦ createdFri, 18 Jul 2008 16:58:10 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:54:50 GMT?Geneva2ħI25LANDmac Changes 7/19/08; 7:36:09 AM by DW Created. op.deleteSubs () GenevaɏĪ<^LANDmac Changes 7/21/08; 5:43:21 AM by DW Eliminate bold styling no matter what atts.bold says. 7/19/08; 1:47:36 PM by DW Change string.replace to string.replaceall. 7/19/08; 7:35:20 AM by DW Created. local (atts) op.attributes.getall (@atts) local (adruser = instantOutlineSuite.initUser (atts.name)) dialog.alert (adruser^.outlineurl) op.deleteSubs () op.insertOutline (@adruser^.outline, right) if atts.bold atts.bold = false op.attributes.addgroup (@atts) bundle //eliminate bold styling local (lt = op.getlinetext ()) lt2 = string.replaceall (lt, "", "") lt2 = string.replaceall (lt2, "", "") if lt2 != lt op.setlinetext (lt2) WdatatablGĩxĩx createdMon, 21 Jul 2008 12:43:20 GMTWdatatablGĩyĩy createdMon, 21 Jul 2008 12:43:21 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:47:35 GMTWdatatablGħħ createdSat, 19 Jul 2008 20:47:37 GMTWdatatablG.. createdFri, 24 Jun 2005 10:30:45 GMTWdatatablG.. createdFri, 24 Jun 2005 10:30:46 GMTWdatatabl0GĦĦ createdSat, 19 Jul 2008 03:48:26 GMTWdatatabl0GĦ Ħ createdSat, 19 Jul 2008 03:48:13 GMTWdatatabl0GĦTĦT createdSat, 19 Jul 2008 03:49:24 GMTWdatatabl0GĦĦ createdSat, 19 Jul 2008 03:48:29 GMTWdatatablGħ%ħ% createdSat, 19 Jul 2008 20:44:05 GMTWdatatablGħHħH createdSat, 19 Jul 2008 20:44:40 GMTcBGeneva   `???????!${Ҽf macDwindowsħe> createdSat, 19 Jul 2008 16:32:46 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:59 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:25:37 GMTWdatatablGħcħc createdSat, 19 Jul 2008 16:26:04 GMT@2GenevaŵŵLANDmac instantOutlineSuite.menuCommands.sendToTwitter () Genevaŵŵ LANDmac Send To Twitter... -  p kGenevapXGenevaĦ0šhRLANDmac on saveButton () Changes 7/18/08; 11:36:19 AM by DW Created. This is what happens when the user clicks on the Save button. instantOutlineSuite.init () instantOutlineSuite.saveMyOutline () instantOutlineSuite.sendUpdateNotice () Frontier.tools.data.windowTypes.outlinerFile.save (window.frontmost ()) bundle //test code saveButton () Wdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:36:16 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:36:18 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:36:20 GMTWdatatabl0GĦ1bĦ1b createdFri, 18 Jul 2008 18:39:14 GMTWdatatabl0GĦJĦJ createdFri, 18 Jul 2008 16:43:38 GMTWdatatabl0GĦ0-Ħ0- createdFri, 18 Jul 2008 18:34:05 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:36:30 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:36:36 GMT GenevaĦ^ųn![LANDmac on saveMyOutline () Changes 2/7/09; 10:50:34 AM by DW The text of the headline the cursor is on is sent along, and is posted as a comment to the room. 2/3/09; 11:23:27 AM by DW Pass the room name to the server. 1/30/09; 10:54:36 AM by DW Pass moddate of the outline to the server. 1/27/09; 1:38:22 PM by DW When creating OPML get the name from the user's identity, not their editor prefs. (That way Bull Mancuso's outline has his name on it not mine.) 7/18/08; 9:44:07 AM by DW Created. msg ("Saving...") local (server = instantOutlineSuite.data.urls.ioserver, username, password, id, comment) bundle //get the comment local (oldtarget = target.set (@user.instantOutline.myOutline)) comment = op.getlinetext () target.set (oldtarget) instantOutlineSuite.getUserNameAndPassword (@username, @password, @id) local (s = op.outlinetoxml (@user.instantOutline.myOutline, username, ownerId:id)) user.instantOutline.stats.ctSaves++ user.instantOutline.stats.whenLastSave = clock.now () local (moddate = timemodified (@user.instantOutline.myOutline), room = user.instantOutline.prefs.roomName) user.instantOutline.prefs.outlineUrl = [server].instantOutlineServer.saveOutline (username, password, s, moddate, room, comment) msg ("") bundle //test code saveMyOutline () Wdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:35:27 GMTWdatatabl0GĦfĦf createdFri, 18 Jul 2008 16:44:06 GMTWdatatabl0GĦhĦh createdFri, 18 Jul 2008 16:44:08 GMTWdatatablGħħ createdSat, 19 Jul 2008 21:09:05 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:58:10 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:58:24 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:54:50 GMTWdatatablGħ ħ createdSat, 19 Jul 2008 21:09:13 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:35:37 GMTWdatatabl0GĦ0Ħ0 createdFri, 18 Jul 2008 18:35:42 GMT `Genevaş]<ŭ LANDmac on authenticate (username, password) Changes 2/3/09; 11:11:53 AM by DW Add call to instantOutlineSuite.init at the top of the script. 2/3/09; 10:56:03 AM by DW Use the parameterized roomname, not the fixed one. 1/28/09; 9:05:10 AM by DW Get the room name from the top-level data table not "workspace." 1/23/09; 11:38:13 AM by DW Authenticate the user for access to a private FriendFeed room. The user must be a member of the room, and of course have a valid username/remotekey pair for getRoomProfile to not error. instantOutlineSuite.init () //2/3/09 by DW try local (profile, name = user.instantOutline.prefs.roomName) FriendFeed.getRoomProfile (name, @profile, username, password) return (true) else return (false) bundle //test code dialog.alert (authenticate (user.friendFeed.prefs.username, user.friendFeed.prefs.remotekey)) WdatatablGħyyħyy createdSat, 19 Jul 2008 17:59:05 GMT)$GenevaŨŨ CLANDmac on getUserFile (username) Changes 1/30/09; 10:27:57 AM by DW Created. Return the path to the user's OPML file on the server. local (f = user.instantOutline.server.folder + username + ".opml") file.surefilepath (f) return (f) bundle //test code dialog.alert (getUserFile ("davew")) Wdatatabl0GĦ5Ħ5 createdFri, 18 Jul 2008 16:51:49 GMT)p>GenevaŠdŵɋ+LANDmac on init () Changes 2/9/09; 11:47:57 AM by DW New sub-table: s3, configures server support for s3 storage, initially turned off. Init the folder to a sub-folder of the ops folder, not the empty string. 1/24/09; 12:08:23 PM by DW Created. local (adrdata = @user.instantOutline.server) if not defined (adrdata^) new (tabletype, adrdata) if not defined (adrdata^.folder) adrdata^.folder = frontier.getsubfolder ("ops") + "ioserver" + file.getpathchar () if not defined (adrdata^.url) adrdata^.url = "" if not defined (adrdata^.notificationuser) adrdata^.notificationuser = "" if not defined (adrdata^.notificationkey) adrdata^.notificationkey = "" if not defined (adrdata^.notificationroom) adrdata^.notificationroom = "" bundle //s3 sub-table, 2/9/09 by DW if not defined (adrdata^.s3) new (tabletype, @adrdata^.s3) if not defined (adrdata^.s3.enabled) adrdata^.s3.enabled = false if not defined (adrdata^.s3.path) adrdata^.s3.path = "" if not defined (adrdata^.s3.url) adrdata^.s3.url = "" return (adrdata) bundle //test code init () puGenevaĦŠ->LANDmac Changes 1/24/09; 9:55:33 AM by DW Created. Run this script to turn your machine into an I/O server. user.betty.rpchandlers.instantOutlineServer = @instantOutlineSuite.server.rpchandlers filemenu.save () Wdatatabl0GĦĦ createdFri, 18 Jul 2008 16:53:34 GMTF`n GenevaůRŵ fyLANDmac on getMemberUrls (memberstable) Changes 2/9/09; 10:57:07 AM by DW If there is no outline for the user, return an empty string for the url. 2/4/09; 10:04:13 AM by DW New API routine supports new buddy discovery method employed in instantOutlineSuite.discoverBuddies. local (adr) for adr in @memberstable local (f = instantOutlineSuite.server.getUserFile (nameof (adr^))) if file.exists (f) adr^ = user.instantOutline.server.url + file.filefrompath (f) else adr^ = "" //2/9/09 by DW return (memberstable) bundle //test code scratchpad.filledmemberstable = getMemberUrls (scratchpad.memberstable) FNPGenevaŨű~LANDmac on getOutlineModified (username) Changes 2/6/09; 11:39:21 AM by DW If the outline doesn't exist return date (0) -- that way when you make your first entry you don't get an error message from the server saying the file doesn't exist. 1/30/09; 10:34:57 AM by DW New server call, returns the mod date of the user's outline. Since this data is public, it doesn't require a password. local (f = instantOutlineSuite.server.getUserFile (username)) if file.exists (f) return (file.modified (f)) else return (date (0)) bundle //test code dialog.alert (getOutlineModified ("davew"))  GenevaĦ6;Š LANDmac on getOutlineUrl (username) Changes 7/21/08; 10:11:41 AM by DW Add special cases for techjunk and newsjunk. 7/18/08; 11:56:18 AM by DW Created. case string.lower (username) "techjunk" return ("http://tech.newsjunk.com/index.opml") "newsjunk" return ("http://newsjunk.com/index.opml") return (user.instantOutline.server.url + username + ".opml") bundle //test code dialog.alert (getoutlineurl ("dave")) Wdatatabl0GĦ5_Ħ5_ createdFri, 18 Jul 2008 18:56:15 GMTWdatatablGĪ\Ī\ createdMon, 21 Jul 2008 17:11:40 GMTWdatatablGĪ]Ī] createdMon, 21 Jul 2008 17:11:41 GMTWdatatabl0GĦ5aĦ5a createdFri, 18 Jul 2008 18:56:17 GMTWdatatabl0GĦ5cĦ5c createdFri, 18 Jul 2008 18:56:19 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:10:00 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:10:05 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:10:25 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:10:33 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:10:39 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:51:27 GMTWdatatabl0GĦ5Ħ5 createdFri, 18 Jul 2008 18:57:18 GMTWdatatabl0GĦ5Ħ5 createdFri, 18 Jul 2008 18:57:22 GMT Geneva šثŵ̛N=LANDmac on saveOutline (username, password, opmltext, moddate=nil, room=nil, comment=nil) Changes 2/9/09; 12:05:21 PM by DW If S3 is enabled, save the data there as well as the local file system. 2/7/09; 10:49:53 AM by DW Takes an optional comment parameter. 2/3/09; 11:24:30 AM by DW Takes an optional "room" parameter. 1/31/09; 11:40:49 AM by DW Call instantOutlineSuite.server.sendUpdateNotice with a new parameter that makes the update come from the author of the outline not a mythical user. 1/31/09; 11:15:08 AM by DW Save a second copy of the file in a calendar file structure. 1/30/09; 10:50:38 AM by DW New optional param, moddate, if not nil, says when the outline was modified, and we do a filesystem call to set the moddate to that date. 1/30/09; 10:30:57 AM by DW Commented debugging code, call instantOutlineSuite.server.getUserFile to get the filename of the user's OPML file. 1/28/09; 9:38:23 AM by DW Throw an error when the username/password doesn't authenticate. 1/25/09; 8:51:37 AM by DW Send the update notice in a thread, so it happens sooner. 1/23/09; 12:13:55 PM by DW Call workspace.instantOutlineServer.authenticate to authenticate. 7/19/08; 11:10:38 AM by DW Add authentication. 7/18/08; 9:52:14 AM by DW Created. Very preliminary first version of this. local (adrdata = instantOutlineSuite.server.init ()) scratchpad.username = username scratchpad.password = password scratchpad.opmltext = opmltext if instantOutlineSuite.server.authenticate (username, password) local (f = instantOutlineSuite.server.getUserFile (username), fname = file.filefrompath (f), caldate) local (url = user.instantOutline.server.url + fname) thread.callscript (@instantOutlineSuite.server.sendUpdateNotice, {username, password, url, room, comment}) file.writewholefile (f, opmltext) if moddate != nil //1/30/09 by DW file.setmodified (f, moddate) bundle //save it in a calendar file structure, 1/31/09 by DW caldate = clock.now () if moddate != nil caldate = moddate local (fcal = user.instantOutline.server.folder + file.getdatepath (theDate:caldate) + fname) file.surefilepath (fcal) file.writewholefile (fcal, opmltext) if moddate != nil file.setmodified (fcal, moddate) bundle //s3 support, 2/9/09 by DW if adrdata^.s3.enabled s3.newobject (adrdata^.s3.path + fname, opmltext) s3.newobject (adrdata^.s3.path + file.getdatepath ("/", caldate) + fname, opmltext) return (url) else scriptError ("Can't save the outline because the username \"" + username + "\" didn't authenticate.") bundle //test code saveoutline (scratchpad.username, scratchpad.password, scratchpad.opmltext) Wdatatabl0GĦJĦJ createdFri, 18 Jul 2008 16:52:10 GMTWdatatablGħ|-ħ|- createdSat, 19 Jul 2008 18:10:37 GMTWdatatablGħ|.ħ|. createdSat, 19 Jul 2008 18:10:38 GMTWdatatabl0GĦLĦL createdFri, 18 Jul 2008 16:52:12 GMTWdatatabl0GĦOĦO createdFri, 18 Jul 2008 16:52:15 GMTWdatatablGŠŠ createdSat, 24 Jan 2009 21:23:53 GMTWdatatablGŠŠ createdSat, 24 Jan 2009 21:23:57 GMTWdatatablGŠŠ createdSat, 24 Jan 2009 21:24:08 GMTWdatatablGħ|!ħ|! createdSat, 19 Jul 2008 18:10:25 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:51:17 GMTWdatatabl0GĦ5Ħ5 createdFri, 18 Jul 2008 16:51:49 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:51:17 GMTWdatatabl0GĦĦ createdFri, 18 Jul 2008 16:51:27 GMTWdatatablGħ|&ħ|& createdSat, 19 Jul 2008 18:10:30 GMTWdatatablGħ|(ħ|( createdSat, 19 Jul 2008 18:10:32 GMTWdatatablGŠƼŠƼ createdSat, 24 Jan 2009 21:23:08 GMTWdatatablGŠƿŠƿ createdSat, 24 Jan 2009 21:23:11 GMT8ĦŵZ  -9 GS _ getMemberUrls0*BgetOutlineModified0- getOutlineUrl00 saveOutline07VGeneva 2GUk;GenevaŠų LANDmac on sendUpdateNotice (username, password, outlineurl, room=nil, comment=nil) Changes 2/7/09; 10:48:45 AM by DW Add optional comment parameter. 2/3/09; 11:24:30 AM by DW Takes an optional "room" parameter. 1/31/09; 11:34:45 AM by DW Now the update comes from the person whose outline is updating not from a mythical user ("iou"). 7/21/08; 10:31:50 AM by DW Pass in name as a parameter. 7/16/08; 8:03:27 PM by DW Created. local (username = user.instantOutline.server.notificationuser) local (remotekey = user.instantOutline.server.notificationkey) local (room = user.instantOutline.server.notificationroom) if room == nil room = user.instantOutline.server.notificationroom local (s = "updated: " + username) friendfeed.newpost (s, username, password, link:outlineurl, room:room, comment:comment) bundle //test code sendUpdateNotice ("davew", user.FriendFeed.prefs.remotekey, "http://scripting.com/ioserver/davew.opml") WdatatablGĤĤ createdThu, 17 Jul 2008 03:03:24 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:31:49 GMTWdatatablGĪĪ createdMon, 21 Jul 2008 17:31:50 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:03:26 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:03:27 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:04:24 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:04:30 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:04:52 GMTWdatatablGĤĤ createdThu, 17 Jul 2008 03:03:36 GMTWdatatablGĤ!Ĥ! createdThu, 17 Jul 2008 03:05:53 GMTWdatatablGĤ$Ĥ$ createdThu, 17 Jul 2008 03:05:56 GMTk5LĦMŵY  %1 6B JV bn  authenticate getUserFile init"install({ rpchandlersIsendUpdateNoticeJVGeneva 2GU5GenevaħoMħos*LANDmac on setWindowFontAndSize () Changes 7/19/08; 10:15:54 AM by DW Created. editmenu.setfont (user.instantOutline.prefs.windowFont) editmenu.setfontsize (user.instantOutline.prefs.windowFontSize) WdatatablGħoWħoW createdSat, 19 Jul 2008 17:15:51 GMTWdatatablGħoYħoY createdSat, 19 Jul 2008 17:15:53 GMTWdatatablGħoZħoZ createdSat, 19 Jul 2008 17:15:54 GMTWdatatablGħo\ħo\ createdSat, 19 Jul 2008 17:15:56 GMTWdatatablGħo\ħo\ createdSat, 19 Jul 2008 17:15:56 GMT }Geneva Ĥ8Ĥ8LANDmac This script returns a string which appears in the Status Center on the Radio UserLand home page. return ("I'm a cool Tool!") 5Geneva3839,lzLANDmac on callback (adrentry) scratchpad.entry = adrentry^ edit (@scratchpad.entry) scripterror ("fuck you") friendfeed.getRealTimeUpdates (adrcallback:@callback) 5GenevaųAųB;LLANDmac Changes 2/7/09; 1:46:01 PM by DW Some how the URLs of the outlines got out of synch. This script helps investigate how that happens. local (adrdata = instantoutlinesuite.init (), members, memberurls) local (server = instantOutlineSuite.data.urls.ioserver) new (tabletype, @members) for adruser in @adrdata^.users members.[nameof (adruser^)] = true memberurls = [server].instantOutlineServer.getMemberUrls (members) scratchpad.members = members scratchpad.memberurls = memberurls Wdatatabl0GĦĦ createdFri, 18 Jul 2008 16:54:50 GMTGenevaťyťʸ07WLANDmac local (x = instantOutlineThread.ct) instantOutlineThread.ct = 0 workspace.changeNotes.utilities.backupRoot () instantOutlineThread.ct = x V$ťoųA  " fixMemberUrlsYrelease\VGeneva|=.<Ĥ8ŵ  , 9E MY co {   ) 2> CO \h q}      $ 3? JV dp w    addBuddy` background`  buddyUpdated` buttons`.\ callbacks`/ changeNotes`0data`O]discoverBuddies`PQgetAllUserOutlineUrls`aLgetRealtimeUpdates`f*getUserNameAndPassword`init`initUser`menu` menuCommands`newEntry`newerOutlineCheck` nodeTypes`openBuddyOutline` openMyOutline`readUserOutline`refreshBuddyOutline`wrightClickMenu` . saveButton` saveMyOutline`zserver`SJsetWindowFontAndSize`TstatusCenterMessage`Wtesting`X utilities`^!VGenevaK9|GenevaĤ9Ť|LANDmac Changes 1/27/09; 11:12:01 AM by DW Discover buddies at startup. 1/25/09; 8:31:02 AM by DW Make sure the realtimeupdates thread is running. loop instantOutlineThread.ct++ instantOutlineSuite.init () if not defined (system.temp.instantOutline.flStarted) instantOutlineSuite.openMyOutline () thread.callscript (@instantOutlineSuite.discoverBuddies, {}) system.temp.instantOutline.flStarted = true bundle //make sure the realtimeupdates thread is running local (flstart = true) if defined (system.temp.instantoutline.idRealtimeThread) flstart = not thread.exists (system.temp.instantoutline.idRealtimeThread) if flstart thread.callscript (@instantOutlineSuite.getRealtimeUpdates, {}) thread.sleepfor (2) WdatatablGħj!ħj! createdSat, 19 Jul 2008 16:53:37 GMTWdatatabl0GĦ1bĦ1b createdFri, 18 Jul 2008 18:39:14 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:14 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:33 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:27 GMTWdatatablGħiħi createdSat, 19 Jul 2008 16:52:56 GMTP.Ĥ9ŵp ctenabledscript`cqVGeneva 5tGeneva F 2 LANDmac on finalFilter (pta) pta^.renderedText = string.replace (pta^.renderedText, "[[title]]", "") return (true) ����������������������������� ���-����Geneva���������������������������� ��������������Eu �������2 LAND������mac ������������on firstFilter (adrPageTable) return (true) �����������������������*��[����Geneva���������������������������� ��������������Eu ���v���}�2'LAND������mac ������������on pageFilter (pta) if typeOf (pta^.template) == outlineType or typeOf (pta^.template) == wpTextType table.assign (@pta^.template, string (pta^.template)) if typeOf (pta^.template) == stringType and not pta^.indirectTemplate pta^.template = string.replace (pta^.template, "<title>", "[[title]]") html.addPageToGlossary (pta) return (true) �����������������������������������������������y���.���EF�������� ���� ��� ����$���0 ����; finalFilter����p�j� firstFilter����p�k pagefilter����p�k��VGeneva���������������������������� �����������G�N��)�����������������������������������F������7ů|N�������� ����url��� http://127.0.0.1/instantOutline/��VGeneva���������������������������� �����������A��'��������������������������������������$���ű.ű.�������� ���� ��� ����linetext���}["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:instantOutline.root"].instantOutlineWebsite.changeRoompath���changeRoom.wsf������O�������K���$���ůvův�������� ���� ��� ����linetext���Homepath��� index.wsf���O������������$�������ű.�������� ����~��� ����}["Macintosh HD:Users:davewiner:Desktop:OPML:Guest Databases:apps:Tools:instantOutline.root"].instantOutlineWebsite.changeRoom����p�o[Home����p�p4��VArial����������������������������� ���������������������������������������������������������W����������������������space���/GIFfGIF89a�������!����,�������D�;��VArial����������������������������� ������������������������������������������������������������V��������������� ������� �������"�������+ ����0���: ����C���L ����Q���[ ����aalink���008000bgcolor���FFFFFFflRenderlink���0000FFspaceGif���spacetext���000000vlink���800080��VArial����������������������������� �������������������������������������������������d��������<��������Geneva���������������������������� ��������������F ������z�*LAND������mac ������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>{title} {metaTags ()} {bodyTag ()} {bodytext} dn8>VArial nnlGenevaůxů|,VrLANDmac Changes 2/4/09; 4:54:32 PM by DW Created. local (pta = html.getpagetableaddress (), args) scratchpad.params = pta^ new (tabletype, @args) webserver.parseargs (pta^.searchargs, @args) scratchpad.args = args; edit (@scratchpad.args) frontier.bringtofront () thread.callscript (@instantOutlineSuite.menuCommands.changeRoom, {args.name}) bundle //redirect if defined (pta^.requestHeaders.Referer) local (url = pta^.requestHeaders.Referer) pta^.code = 302 //temporary redirect pta^.responseBody = webserver.util.buildErrorPage ("302 FOUND", "Found the page.") pta^.responseHeaders.location = url pta^.responseHeaders.URI = url return ("") nFFFF000000060001001777AA000000000063000000001001710000001-767F6FFE18000004800480626200-10626222FFFF01030000100000031000000010E840626222E048E000166266000020000001200000000E,#title "Home" 000400000009000000020100000500000009000000020100000600000032000000010C310FFFF0C00000 20 000700000019000000010201600008000000A50000000140,Geneva40,1040304E40101000090000001500000002393174393174000A0000001500000002626222626222000B00000005000000020000C00000013000000010369AF101000F0000005200000000400 10 4,appn4,send4,84,&4,84,34,800130000007E00000000DA91F8CE1C1D1E1F7F1B044,-..'"FFFF0FFFF0FFFE000000060001001777AAPĵ7 6%'j7ůx  * 4@ HT [g q} #filters`m#ftpSite`n #glossary`p#images`q#prefs`ru #template`s#tools`u changeRoom`uindex`yVGeneva vOx?+ LĤ7ŵp  *6 IU iu #installer instantOutlineData instantOutlineInfo *instantOutlineSuite ^instantOutlineThread iJinstantOutlineWebsite }V Lucida GrandeZ\Ydt GenevaŁ$]ŵpOLANDmac #installer instantOutlineData instantOutlineInfo author authorEmail description homePageUrl name releaseDate version instantOutlineSuite addBuddy background buddyUpdated buttons callbacks changeNotes data discoverBuddies getAllUserOutlineUrls getRealtimeUpdates getUserNameAndPassword init initUser rightClickMenu menu menuCommands newEntry newerOutlineCheck nodeTypes openBuddyOutline openMyOutline readUserOutline refreshBuddyOutline saveButton saveMyOutline server setWindowFontAndSize statusCenterMessage testing utilities instantOutlineThread ct enabled script instantOutlineWebsite ```````hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh<<< ' Lucida Grande Lucida Grande ),Geneva 6 Lucida Grande E Lucida Grande Lucida Grande