Beispiel #1
0
        private Board CreateBoard(Uri uri)
        {
            Debug.Assert(uri.Host.Equals("jbbs.shitaraba.net", StringComparison.InvariantCultureIgnoreCase));

            Match match;
            match = Regex.Match(uri.AbsolutePath, @"^/([A-Za-z]+)/(\d+)/?$");
            if (!match.Success)
                match = Regex.Match(uri.AbsolutePath, @"^/bbs/read\.cgi/([A-Za-z]+)/(\d+)($|/)");
            Debug.Assert(match.Success);

            Board b = new Board();

            b._server = this;
            var data = new BoardData();

            data.Category = match.Groups[1].Value;
            data.BoardNumber = match.Groups[2].Value;
            b._data = data;

            return b;
        }
Beispiel #2
0
 public override string GetLocalRules(Board b)
 {
     return "unimplemented";
 }
Beispiel #3
0
        public override List<Thread> GetThreads(Board b)
        {
            var threadList = new List<Thread>();
            var http = new HttpClient();
            BoardData boardData = b._data as BoardData;
            string subjectTxtUri = String.Format("http://jbbs.shitaraba.net/{0}/{1}/subject.txt",
                boardData.Category, boardData.BoardNumber);
            var responseMessage =  http.GetAsync(subjectTxtUri).Result;
            if (!responseMessage.IsSuccessStatusCode)
            {
                throw new ApplicationException("スレッド一覧が取得できません。");
            }
            var bytes = responseMessage.Content.ReadAsByteArrayAsync().Result;

            var eucJp = Encoding.GetEncoding("EUC-JP");
            string body = eucJp.GetString(bytes);

            List<string> threadNumbers = new List<string>();
            var lines = body.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var line in lines)
            {
                // "1370999611.cgi,19(2)"
                var match = Regex.Match(line, @"^(\d+)\.cgi,([^(]+)\((\d+)\)$");
                Debug.Assert(match.Success);
                var threadNumber = match.Groups[1].Value;
                var threadTitle = match.Groups[2].Value;
                var numberOfReses = match.Groups[3].Value;
                if (!threadNumbers.Contains(threadNumber))
                {
                    var threadUri = String.Format("http://jbbs.shitaraba.net/bbs/read.cgi/{0}/{1}/{2}",
                        boardData.Category, boardData.BoardNumber, threadNumber);
                    ThreadData threadData = new ThreadData();
                    threadData.Uri = new Uri(threadUri);
                    var newThread = new Thread(threadNumber.ToInt(), threadTitle, this, threadData);
                    threadList.Add(newThread);
                    threadNumbers.Add(threadNumber);
                }
            }
            return threadList;
        }
Beispiel #4
0
 public override string GetBoardTitle(Board b)
 {
     var data = b._data as BoardData;
     if (data.Settings == null)
         data.Settings = GetSettings(data.Category, data.BoardNumber.ToInt());
     return data.Settings["BBS_TITLE"];
 }
Beispiel #5
0
 public override Uri GetBoardUri(Board b)
 {
     BoardData data = b._data as BoardData;
     return data.uri;
 }
Beispiel #6
0
 public abstract List<Thread> GetThreads(Board b);
Beispiel #7
0
 public override void CreateNewThread(Board b, string title, Message msg)
 {
     return;
 }
Beispiel #8
0
 public abstract string GetLocalRules(Board b);
Beispiel #9
0
 public abstract Uri GetBoardUri(Board b);
Beispiel #10
0
 public abstract string GetBoardTitle(Board b);
Beispiel #11
0
 public abstract void CreateNewThread(Board b, string title, Message msg);
Beispiel #12
0
        static void Open(string[] args)
        {
            if (args.Length != 1)
            {
                Usage("open [url]");
                return;
            }
            string url = args[0];
            Uri uri;
            try
            {
                uri = new Uri(url);
            } catch (UriFormatException)
            {
                Console.WriteLine("URL がおかしいです。");
                return;
            }

            if (Service.IsThread(uri))
            {
                m_Thread = Service.GetThread(uri);
                Console.WriteLine("スレッド{0}を開きました。", m_Thread.Title);
            }
            else
            {
                m_Thread = null;
            }

            if (Service.IsBoard(uri))
            {
                m_Board = Service.GetBoard(uri);
                Console.WriteLine("板「{0}」を開きました。", m_Board.Title);
            }
        }