// ----- for Unity3D
// ■利用方法:
//
// … GameObjectに割り当てた、任意のコード上で
// private AssemblyCSharp.Dat2chLoader datLoader = null;
//
// … Awake などで
// datLoader = new AssemblyCSharp.Dat2chLoader();
// datLoader.asyncLoad("http://t...content-available-to-author-only...h.net/test/read.cgi/gamedev/1324187203/");
//
// ※試しに、このスレ「Unity 7ウニ目」http://t...content-available-to-author-only...h.net/test/read.cgi/gamedev/1324187203/
//
// … OnGUI などで
// if(datLoader.isLoaded)
// {
// GUI.TextField(new Rect(32, 32+64, 200, 150), datLoader.getRes(0));
// }
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections;
using System.Threading;
using System.Text.RegularExpressions;
namespace AssemblyCSharp
{
// 2chスレロードクラス。ただのローダなので MonoBehaviour 継承不要
public class Dat2chLoader
{
// 2chスレのURL → datのURL変換用
private const String PAT_2CH = @"^h?ttp:\/\/([^\/]+)\/test\/read\.cgi\/([^\/]+)\/([0-9]+)\/?$";
private const String PAT_DAT = "http://{0}/{1}/dat/{2}.dat";
delegate void OnLoad(String s);
private OnLoad onLoad = null;
private Regex reg = null;
private bool bRun = false;
private String[] arText = null;
// 唯一のコンストラクタ
public Dat2chLoader()
{
reg = new Regex(PAT_2CH);
onLoad = this.done;
}
// 非同期ローダ
public bool asyncLoad(String sUrl)
{
// 一応 re-run 対策
if(bRun) return false;
Match m = reg.Match(sUrl);
if(m==null || m.Length<2) return false;
String sDatUrl = String.Format(PAT_DAT, m.Groups[1], m.Groups[2], m.Groups[3]);
//UnityEngine.Debug.Log(sDatUrl);
// 子スレッド起こしてロード
Thread th = new Thread(new ThreadStart(delegate() {
// 要はインターネットからリソースロードする、普通の処理
try {
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sDatUrl);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
String sTmp = null;
StreamReader sr = null;
using(
sr = new StreamReader(
res.GetResponseStream(), Encoding.Default
)
){
sTmp = sr.ReadToEnd();
}
// デリゲートメソッドに渡すにあたって、障害時の切り分け用に、
// usingブロック外で通知
onLoad(sTmp);
} catch(Exception e) {
// 一応、大雑把なエラーハンドリング
onLoad("-- error --:" + e.Message);
}
}));
th.Start();
return bRun = true;
}
// 終了が通知されるメソッド ※外部から叩かれても困るので private
private void done(String s)
{
arText = s.Split('\n');
bRun = false;
}
// ロード完了してるか?
public bool isLoaded { get { return arText != null; } }
// ロードされたスレのレス数はいくつ?
public int length { get { return arText != null? arText.Length: 0; }}
// 適当な文字列の取得メソッド(スレの最初のレス)。適宜変更を
public String getRes(int index)
{
return arText[index];
}
}
}