forked from: favると流れてくる
/**
* Copyright Thy ( http://wonderfl.net/user/Thy )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/bWUD
*/
// forked from bkzen's favると流れてくる
package
{
import com.bit101.components.Label;
import com.bit101.components.Style;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.net.URLRequest;
import net.wonderfl.utils.WonderflAPI;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Expo;
/**
* ワンダフルの API が誰が fav ったか、
* どんなコメント付いてるかとか
* フォローしてる人はどれくらい居るとか、誰だとか
* を教えてくれないのでとりあえず自分で作った。
* loadC(id); // (http://wonderfl.net/c/[id])
* loadFollowers(id); // (http://wonderfl.net/user/[id]/followers)
* load(id); // (http://wonderfl.net/user/[id])
* それぞれの HTML をただ返すだけ。
* そっからは煮るなり焼くなりコロスケなり。
*
* 注意
* ※ カヤックさんに怒られたら消す。
* ※ 危険だったら消す。
* ※ サーバー負荷がやばくなったら消す。
* ※ HTMLの書き方が変わったら使えなくなる。
* ※ カヤックさんが用意してくれると嬉しいなぁー。(鎌倉の方を見ながら)
* @author jc at bk-zen.com
*/
[SWF (backgroundColor = "0xFFFFFF", frameRate = "30", width = "465", height = "465")]
public class FavGetTest extends Sprite
{
private var loader: WonderflExtendsAPI;
private var api: WonderflAPI;
private var favs: Array;
private var follower: AllFollowsData;
private var following: AllFollowsData;
private var label: Label;
private var icons: Array = [];
public function FavGetTest()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e: Event = null): void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
Style.fontName = "_typewriter";
Style.fontSize = 12;
Style.embedFonts = false;
loader = new WonderflExtendsAPI(null, errorHandler);
api = new WonderflAPI(loaderInfo.parameters);
label = new Label(this, 0, 0, "now loading...");
label.x = stage.stageWidth - label.width >> 1;
label.y = stage.stageHeight - label.height >> 1;
loader.loadC(api.appID || "h3SO", onCompC);
}
private function errorHandler(e: ErrorEvent):void
{
error(e.type);
}
private function onCompC(res: String):void
{
var str: String = WonderflExtendsAPI.getFav(res), xml: XML, b: Boolean;;
if (str)
{
// favs
xml = new XML(str);
favs = new AllFavsData(xml).favs;
var i: int, n: int = favs.length;
for (i = 0; i < n; i++)
{
var f: FavData = favs[i];
icons[i] = new Icon(f.thumbURL, f.name, f.userURL, f.comment);
if (f.name == api.viewerDisplayName) b = true;
}
label.text = b ? "Thank you for your favorites!" : "Please Add to Favorites. and reload";
label.draw();
label.x = stage.stageWidth - label.width >> 1;
label.y = stage.stageHeight - label.height >> 1;
BetweenAS3.to(label, { alpha: 0 }, 2).play();
addEventListener(Event.ENTER_FRAME, loop);
}
else
{
label.text = "no favs\nPlease Add to Favorites. and reload";
label.x = stage.stageWidth - label.width >> 1;
label.y = stage.stageHeight - label.height >> 1;
}
}
private function loop(e:Event):void
{
var i: int, n: int = icons.length, icon: Icon;
for (i = 0; i < n; i++)
{
icon = icons[i];
if (icon.flag == 0 && icon.visible)
{
iconInit(icon);
icon.flag = 1;
addChild(icon);
}
if (icon.visible)
{
icon.x --;
if (icon.x < - icon.width) iconInit(icon);
}
}
}
private function iconInit(icon:Icon):void
{
icon.x = stage.stageWidth + Math.random() * 200, icon.y = Math.random() * (stage.stageHeight - 100);
var i: int, n: int = icons.length, ic: Icon, mx: int = icon.x + icon.width, iy: int = icon.y;
for (i = 0; i < n; i++)
{
ic = icons[i];
if (ic.visible && ic.flag == 1)
{
if (iy - 50 < ic.y && iy + 100 > ic.y)
{
var tx: int = ic.x + ic.width + 50;
if (mx < tx) mx = tx;
}
}
}
icon.x = mx;
}
private function onCompLoad(res: String): void
{
var str: String = WonderflExtendsAPI.getFollowing(res), xml: XML;
if (str)
{
// following
xml = new XML(str);
following = new AllFollowsData(xml);
}
}
private function onCompFollowers(res: String): void
{
var str: String = WonderflExtendsAPI.getFollowers(res), xml: XML;
if (str)
{
// followers
xml = new XML(str);
follower = new AllFollowsData(xml);
}
}
private function error(text: String):void
{
}
}
}
import com.bit101.components.Label;
import flash.display.Loader;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.SecurityErrorEvent;
import flash.net.navigateToURL;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
class WonderflExtendsAPI extends EventDispatcher
{
private static const FAV_START: String = '<section id="sectFavBy" class="group">';
private static const FAV_END: String = '<!-- /#sectFavBy --></section>';
private static const FOLLOWING_START: String = '<section id="sectFollowing">';
private static const FOLLOWING_END: String = '<!-- / #sectFollowing --></section>';
private static const FOLLOWERS_START: String = '<div class="follower_box autopagerize_page_element">';
private static const FOLLOWERS_END: String = '</div>';
private var loader:URLLoader;
private var _errorHandler:Function;
private var _errorHandlerSub:Function;
private var _completeHandler: Function;
private var _completeHandlerSub: Function;
private var _id: String;
/**
* ワンダフルの API が誰が fav ったか、
* どんなコメント付いてるかとか
* フォローしてる人はどれくらい居るとか、誰だとか
* を教えてくれないのでとりあえず自分で作った。
* loadC(id); // (http://wonderfl.net/c/[id])
* loadFollowers(id); // (http://wonderfl.net/user/[id]/followers)
* load(id); // (http://wonderfl.net/user/[id])
* それぞれの HTML をただ返すだけ。
* そっからは煮るなり焼くなりコロスケなり。
*
* 注意
* ※ カヤックさんに怒られたら消す。
* ※ 危険だったら消す。
* ※ サーバー負荷がやばくなったら消す。
* ※ HTMLの書き方が変わったら使えなくなる。
* ※ カヤックさんが用意してくれると嬉しいなぁー。(鎌倉の方を見ながら)
* @author jc at bk-zen.com
* @param completeHandler
* @param errorHandler
*/
function WonderflExtendsAPI(completeHandler: Function = null, errorHandler: Function = null)
{
_completeHandler = completeHandler, _errorHandler = errorHandler;
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
loader.dataFormat = URLLoaderDataFormat.TEXT;
}
/**
* (http://wonderfl.net/c/[id]) の HTML を返す。
* @param id: code id
* @param completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
* @param errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
*/
public function loadC(id: String, completeHandler: Function = null, errorHandler: Function = null): void
{
_id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
loader.load(new URLRequest("http://wonderfl.bk-zen.com/c/?id=" + _id));
}
/**
* (http://wonderfl.net/user/[id]/followers) の HTML を返す。
* @param id: ユーザーID
* @param completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
* @param errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
*/
public function loadFollowers(id: String, completeHandler: Function = null, errorHandler: Function = null): void
{
_id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
loader.load(new URLRequest("http://wonderfl.bk-zen.com/user/?id=" + _id + "&method=followers"));
}
/**
* (http://wonderfl.net/user/[id]) の HTML を返す。
* @param id: ユーザーID
* @param completeHandler: サブハンドラ、コンストラクタで渡したコンプリートイベントハンドラとは別に呼ぶ。
* @param errorHandler: サブハンドラ、コンストラクタで渡したエラーイベントハンドラとは別に呼ぶ。
*/
public function load(id: String, completeHandler: Function = null, errorHandler: Function = null): void
{
_id = id, _completeHandlerSub = completeHandler, _errorHandlerSub = errorHandler;
loader.load(new URLRequest("http://wonderfl.bk-zen.com/user/?id=" + _id));
}
/**
* サーバーから帰ってきた HTML から
* fav の部分だけをパースする。
* @param str: サーバーから帰ってきたHTML
* @return
*/
public static function getFav(str: String): String
{
var s: int = str.lastIndexOf(FAV_START);
if (s < 0) return "";
var e: int = str.indexOf(FAV_END, s);
if (e < 0) return "";
return str.substring(s, e + FAV_END.length);
}
/**
* サーバーから帰ってきた HTML から
* following の部分だけをパースする。
* @param str: サーバーから帰ってきたHTML
* @return
*/
public static function getFollowing(str: String): String
{
var s: int = str.indexOf(FOLLOWING_START);
if (s < 0) return "";
var e: int = str.indexOf(FOLLOWING_END, s);
if (e < 0) return "";
return str.substring(s, e + FOLLOWING_END.length);
}
/**
* サーバーから帰ってきた HTML から
* followers の部分だけをパースする。
* @param str: サーバーから帰ってきたHTML
* @return
*/
public static function getFollowers(str: String): String
{
var s: int = str.indexOf(FOLLOWERS_START);
if (s < 0) return "";
var e: int = str.indexOf(FOLLOWERS_END, s);
if (e < 0) return "";
return str.substring(s, e + FOLLOWERS_END.length);
}
private function onComplete(e: Event): void
{
if (loader.data == "error")
{
var error: ErrorEvent = new ErrorEvent(ErrorEvent.ERROR, false, false, "error : id=" + _id);
if (_errorHandler != null) _errorHandler(error);
if (_errorHandlerSub != null) _errorHandlerSub(error);
}
else
{
if (_completeHandler != null) _completeHandler("" + loader.data);
if (_completeHandlerSub != null) _completeHandlerSub("" + loader.data);
}
}
private function onError(e: ErrorEvent): void
{
if (_errorHandler != null) _errorHandler(e);
if (_errorHandlerSub != null) _errorHandlerSub(e);
}
}
/**
* fav のデータオブジェクト
*/
class AllFavsData
{
private var _favs: Array = [];
function AllFavsData(xml: XML)
{
var nocomment: XMLList = xml.div.(@["class"] == "unitGroup group").div;
var i:int, n: int = nocomment.length();
for (i = 0; i < n; i++)
{
_favs.push(new FavData(nocomment[i]));
}
var comment: XMLList = xml.div.(@["class"] == "unitFavUserL group");
n = comment.length();
for (i = 0; i < n; i++)
{
_favs.push(new FavData(comment[i].p[0], comment[i].p[1]));
}
_favs.reverse();
}
public function get favs(): Array { return _favs; }
}
class FavData
{
public static const NO_COMMENT_XML: XML = new XML();
private var _xml: XML;
private var _comment: XML;
function FavData(xml: XML, comment: XML = null) { _xml = xml, _comment = comment || NO_COMMENT_XML; }
public function get name(): String { return _xml.a.@title; }
public function get thumbURL(): String { return "http://wonderfl.net" + _xml.span.a.img.@src; }
public function get userURL(): String { return _xml.a.@href; }
public function get comment(): String { return _comment.toXMLString(); }
}
/**
* Follow 系のデータオブジェクト
*/
class AllFollowsData
{
private var _follows: Array = [];
function AllFollowsData(xml: XML)
{
var follows: XMLList = xml.ul.li;
var i:int, n: int = follows.length();
for (i = 0; i < n; i++)
{
_follows[i] = new FollowData(follows[i]);
}
}
}
class FollowData
{
private var _xml: XML;
function FollowData(xml: XML) { _xml = xml; }
public function get name(): String { return _xml.a.@title; }
public function get userURL(): String { return _xml.a.@href; }
public function get thumbURL(): String { return "http://wonderfl.net" + _xml.span.a.img.@src; }
}
import flash.display.Sprite;
class Icon extends Sprite
{
private var icon:Loader;
private var nameLabel:Label;
private var commentLabel: TextField;
private var _w: int;
public var flag: int = 0; // ごめんこのあたり適当
function Icon(url: String, name: String, userURL: String, comment: String = "")
{
visible = false
addChild(icon = new Loader());
icon.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
icon.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
nameLabel = new Label(this, 0, 0, name);
nameLabel.x = 60;
_w = nameLabel.width + nameLabel.x;
if (comment)
{
addChild(commentLabel = new TextField());
commentLabel.x = 60, commentLabel.y = 15;
commentLabel.autoSize = TextFieldAutoSize.LEFT;
commentLabel.defaultTextFormat = new TextFormat("_typewriter", 12, 0x555555);
commentLabel.htmlText = comment;
_w = 60 + commentLabel.width;
}
icon.load(new URLRequest(url));
icon.addEventListener(MouseEvent.CLICK, function(e: Event): void {
navigateToURL(new URLRequest(userURL));
} );
}
private function onIOError(e: IOErrorEvent): void
{
removeChild(icon);
visible = true;
}
private function onComp(e:Event):void
{
icon.scaleX = icon.scaleY = 0.5;
visible = true;
}
override public function get width():Number { return _w; }
}