Changeset 18787

Show
Ignore:
Timestamp:
09/04/08 07:23:46 (5 years ago)
Author:
NeoCat
Message:

Add plugin infrastructure.
Refine login check.

Location:
websites/twicli
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • websites/twicli/index.html

    r18198 r18787  
    4545<li>ユーザのアイコンをクリックするとプロフィールのWebページへジャンプ(設定されている場合のみ) 
    4646<li>「☞」をクリックすると、返信先を次々と辿っていくことができます。一覧に無い場合も返信先をオーバーレイ表示します。 
     47<li>ユーザのTLの最後に▽が出ている場合、クリックすると過去の発言を取得します。 
    4748</ul> 
    4849<li>発言/fav 
  • websites/twicli/twicli.html

    r18408 r18787  
    2424#tw div { border-bottom: solid 1px #777; } 
    2525#tw div div, #tw2 div div { padding: 2px; border-bottom: solid 1px #999; } 
     26.dir { color: #679; } 
    2627.status { text-decoration: none; color: black; cursor: pointer; } 
    2728.date { color: #999; font-size: x-small; } 
     
    3334#next { text-align: center; background-color: #999; color: #fec; cursor: pointer; } 
    3435#rep { display: none; background-color: #fee; position: absolute; width: 90%; left: 4%; top: 200px; border: #666 4px solid; z-index: 2; padding: 2px; font-size: small; } 
    35 #user_info { margin: 1px; border: #888 solid 1px: } 
     36#user_info { margin: 1px; border: solid 1px #888; } 
    3637#user_info td { font-size: small; } 
    3738--></style> 
     39<script> 
     40var nr_limit = 500;                             // 表示する発言数の上限 
     41function $(id) { return document.getElementById(id); } 
     42// クロスドメインJavaScript呼び出し 
     43function loadXDomainScript(url, ele) { 
     44        if (ele) 
     45                ele.parentNode.removeChild(ele); 
     46        ele = document.createElement("script"); 
     47        ele.src = url; 
     48        ele.type = "text/javascript"; 
     49        document.body.appendChild(ele); 
     50        return ele; 
     51} 
     52// クロスドメインJavaScript呼び出し(クラスバージョン) 
     53function XDomainScript() { 
     54        this.cb_cnt = (new Date).getTime(); 
     55} 
     56XDomainScript.prototype = { 
     57        load: function(url, callback) { 
     58                var id = this.cb_cnt++; 
     59                var ele = document.createElement("script"); 
     60                ele.src = url + (url.indexOf('?') < 0 ? '?' : '&') + 'callback=xds.cb' + id; 
     61                ele.type = "text/javascript"; 
     62                this['cbe' + id] = ele; 
     63                this['cb' + id] = function(){ this.abort(id); callback.apply(this, arguments); } 
     64                document.body.appendChild(ele); 
     65                return id; 
     66        }, 
     67        abort: function(id) { 
     68                var ele = this['cbe' + id]; 
     69                ele.parentNode.removeChild(ele); 
     70                delete this['cb' + id]; 
     71                delete this['cbe' + id]; 
     72        } 
     73}; 
     74var xds = new XDomainScript; 
     75// 要素の位置を取得 
     76function cumulativeOffset(ele) { 
     77        var top = 0, left = 0; 
     78        do { 
     79                top += ele.offsetTop  || 0; 
     80                left += ele.offsetLeft || 0; 
     81                ele = ele.offsetParent; 
     82        } while (ele); 
     83        return [left, top]; 
     84} 
     85// Cookie 
     86function readCookie(key) { 
     87        key += "="; 
     88        var scookie = document.cookie + ";"; 
     89        start = scookie.indexOf(key); 
     90        if (start != -1) { 
     91                var end = scookie.indexOf(";", key); 
     92                return unescape(scookie.substring(start + key.length, end)); 
     93        } 
     94        return null; 
     95} 
     96function writeCookie(key, val, days) { 
     97        var sday = new Date(); 
     98        sday.setTime(sday.getTime() + (days * 1000 * 60 * 60 * 24)); 
     99        document.cookie = key + "=" + escape(val) + ";expires=" + sday.toGMTString(); 
     100} 
     101 
     102function twAuth(a) {} // 認証(FIXME - FF:毎回認証要求される・Safari:ログインできない) 
     103</script> 
     104<!--script src="http://twitter.com/account/verify_credentials.json?callback=twAuth"></script--> 
    38105</head> 
    39106<body onLoad="init()"> 
     
    55122<a id="user" href="javascript:void switchUser()">user</a> 
    56123<a id="direct" href="javascript:void switchDirect()">direct</a> 
    57 <a id="help" href="javascript:void switchHelp()">?</a> 
     124<a id="misc" href="javascript:void switchMisc()">+</a> 
    58125</div> 
    59126</div> 
     
    65132 
    66133<script type="text/javascript"> 
    67 var nr_limit = 500;                             // 表示する発言数の上限 
    68  
    69 function $(id) { return document.getElementById(id); } 
     134var pluginstr = readCookie('tw_plugins') || ''; 
     135var plugins = new Array; 
    70136var nr_tw = 0; 
    71137var seq = (new Date).getTime(); 
     
    87153var failover_timeout = false; 
    88154 
    89 // クロスドメインなJavaScriptを呼び出し 
    90 function loadXDomainScript(url, ele) { 
    91         if (ele) 
    92                 ele.parentNode.removeChild(ele); 
    93         ele = document.createElement("script"); 
    94         ele.src = url; 
    95         ele.type = "text/javascript"; 
    96         document.body.appendChild(ele); 
    97         return ele; 
    98 } 
    99 // 要素の位置を取得 
    100 function cumulativeOffset(ele) { 
    101         var top = 0, left = 0; 
    102         do { 
    103                 top += ele.offsetTop  || 0; 
    104                 left += ele.offsetLeft || 0; 
    105                 ele = ele.offsetParent; 
    106         } while (ele); 
    107         return [left, top]; 
    108 } 
    109155// ローディング表示ON、twit更新 
    110156function reload(to) { 
     
    146192        } 
    147193} 
    148 // reply 
     194// reply先を設定 
    149195function replyTo(user, id) { 
    150196        if (window.getSelection() && window.getSelection().toString() == '') { 
     
    179225        $("loading").style.display = "none"; 
    180226        $('reps').innerHTML = makeHTML(tw); 
     227        callPlugins("newMessageElement", $('reps'), tw); 
    181228        $('rep').style.display = "block"; 
    182229        $('rep').style.top = rep_top; 
     
    188235// 最新タイムラインを取得 
    189236function update() { 
     237        for (var i in plugins) if (plugins[i].update) plugins[i].update(s, tw); 
    190238        update_ele = loadXDomainScript('http://twitter.com/statuses/friends_timeline?seq=' + (seq++) + 
    191239                                                                        '&callback=twShow' + (since_id ? '&since_id='+since_id : ''), update_ele); 
     
    203251                        (tw.user.url ? '<a target="twitter" href="'+tw.user.url+'">' : '') + 
    204252                        '<img align="left" width="24" height="24" src="' + tw.user.profile_image_url + '">' + (tw.user.url ? '</a>' : '') + 
    205                         /*ダイレクトメッセージの方向*/ (tw.d_dir == 1 ? '<b>←</b> ' : tw.d_dir == 2 ? '<b>→</b> ' : '') + 
    206253                        //名前 
    207254                        "<a href=\"javascript:switchUser('" + tw.user.screen_name + "')\">" + tw.user.screen_name + 
    208255                         /*プロフィールの名前*/ (tw.user.name!=tw.user.screen_name ? '('+tw.user.name+')' : '') + '</a>' + 
    209                          /* protected? */ (tw.user.protected ? '<img class="lock" src="http://assets0.twitter.com/images/icon_red_lock.gif">' : '') 
     256                         /* protected? */ (tw.user.protected ? '<img class="lock" src="http://assets0.twitter.com/images/icon_red_lock.gif">' : '') + 
     257                        /*ダイレクトメッセージの方向*/ (tw.d_dir == 1 ? '<span class="dir">→</span> ' : tw.d_dir == 2 ? '<span class="dir">←</span> ' : '') 
    210258                : '') + 
    211259                //本文クリックで@追加 
     
    237285// 自分の最新の発言を受信 
    238286function twUser(tw) { 
     287        if (!tw[0]) return; 
    239288        myname = last_user = tw[0].user.screen_name; 
    240289        $("user").innerHTML = last_user; 
     
    281330// 受信twitを表示 
    282331function twShow(tw) { 
     332        tw.reverse(); 
     333        for (var j in tw) callPlugins("gotNewMessage", tw[j]); 
     334        tw.reverse(); 
    283335        twShowToNode(tw, $("tw"), false, false, true, true); 
    284336} 
     
    305357function twShowToNode(tw, twNode, no_name, after, animation, check_since) { 
    306358        $('loading').style.display = 'none'; 
    307         if (failover_timeout) clearTimeout(failover_timeout); 
     359        if (failover_timeout) { 
     360                clearTimeout(failover_timeout); 
     361                switchTL(); 
     362        } 
    308363        failover_timeout = false; 
    309364        var len = tw.length; 
     
    322377                        if (tw[i].d_dir == 2 || tw[i].user.screen_name == myname) 
    323378                                s.className = "fromme"; 
     379                        callPlugins("newMessageElement", s, tw[i]); 
    324380                        pNode.insertBefore(s, pNode.childNodes[0]); 
    325381                } 
     
    430486                                                                                '&callback=twDirect2', direct_ele2); 
    431487} 
    432 function switchHelp() { 
    433         switchTo("help"); 
     488function switchMisc() { 
     489        switchTo("misc"); 
    434490        $("tw2h").innerHTML = '<p><a target="twitter" href="index.html"><b>twicli</b></a> : browser-base Twitter client</p><hr>' + 
    435                                                                 '<p><form onSubmit="switchUser($(\'user_id\').value); return false;">show user info : @<input type="text" size="15" id="user_id" value="' + myname + '"></form></p><hr>'; 
     491                                        '<p><form onSubmit="switchUser($(\'user_id\').value); return false;">show user info : @<input type="text" size="15" id="user_id" value="' + myname + '"><input type="image" src="go.png"></form></p><hr>' + 
     492                                        '<p><form onSubmit="setPugins(this.list.value); return false;"><textarea cols="30" rows="4" name="list">' + pluginstr + '</textarea><br><input type="submit" value="register"></form></p><hr>'; 
    436493        $("loading").style.display = "block"; 
    437494        update_ele2 = loadXDomainScript('http://twitter.com/account/rate_limit_status.json?seq=' + (seq++) + 
    438                                                                                 '&id=' + user + '&callback=twLimit', update_ele2); 
     495                                                                                '&id=' + myname + '&callback=twLimit', update_ele2); 
     496} 
     497// プラグイン 
     498function setPugins(str) { 
     499        alert("Plugins are registerd. Please reload."); 
     500        writeCookie('tw_plugins', str, 3652); 
     501} 
     502function registerPlugin(obj) { 
     503        plugins.push(obj); 
     504} 
     505function callPlugins(name) { 
     506        var args = [].slice.apply(arguments); 
     507        args.shift(); 
     508        for (var i in plugins) 
     509                if (typeof plugins[i][name] == "function") 
     510                        plugins[i][name].apply(this, args); 
     511} 
     512if (pluginstr) { 
     513        var list = pluginstr.split("\n"); 
     514        for (var i = 0; i < list.length; i++) 
     515                document.write('<scr'+'ipt src="'+list[i]+'"></scr'+'ipt>'); 
    439516} 
    440517// 初期化 
     
    445522        setInterval(update, 30*1000); 
    446523        // ログインしていなかったときなどに15秒で本家にリダイレクト 
    447         failover_timeout = setTimeout("location.href='http://twitter.com/home'", 15*1000); 
     524        failover_timeout = setTimeout(function(){ switchTo("misc"); $("tw2c").innerHTML = '<iframe style="display:block" src="http://twitter.com/home" width="100%" height="400"></iframe>' }, 15*1000); 
    448525} 
    449526 
     
    466543if (window.addEventListener) window.addEventListener('DOMMouseScroll', wheel, false); 
    467544window.onmousewheel = document.onmousewheel = wheel; 
     545loadXDomainScript('http://twitter.com/statuses/user_timeline.json?count=1&callback=twUser&seq=' + (seq++)); 
    468546</script> 
    469 <script type="text/javascript" src="http://twitter.com/statuses/user_timeline.json?count=1&callback=twUser"></script> 
    470547</body> 
    471548</html>