OSDN Git Service

・あぼーんを検出するようになり、その場合は再取得するようになった。
authoryoffy <yoffy>
Tue, 18 Nov 2003 19:52:02 +0000 (19:52 +0000)
committeryoffy <yoffy>
Tue, 18 Nov 2003 19:52:02 +0000 (19:52 +0000)
res/ExternalBoardPlugIn/ShitarabaPlugIn.dpr

index 053fe25..0285867 100644 (file)
@@ -38,6 +38,10 @@ type
                function        GetBoardURL : string;
 
                procedure       To2chDat( ioHTML : TStringList );
+               procedure       LoadDat;
+               procedure       FreeDat;
+               function        ReadURL : string;
+               function        WriteURL : string;
        end;
 
        // =========================================================================
@@ -69,7 +73,7 @@ const
        MAJOR_VERSION                   = 1;
        MINOR_VERSION                   = 0;
        RELEASE_VERSION         = 'beta';
-       REVISION_VERSION        = 4;
+       REVISION_VERSION        = 5;
 
 // =========================================================================
 // \8eG\97p\8aÖ\90\94
@@ -299,10 +303,7 @@ begin
        FIsTemporary    := False;
        FDat                                    := nil;
 
-       if Copy( URL, Length( URL ), 1 ) = '/' then
-               uri := TIdURI.Create( URL )
-       else
-               uri := TIdURI.Create( URL + '/' );
+       uri                     := TIdURI.Create( ReadURL );
        uriList := TStringList.Create;
        try
                ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
@@ -322,13 +323,7 @@ end;
 destructor TShitarabaThreadItem.Destroy;
 begin
 
-       if FDat <> nil then begin
-               try
-                       FDat.Free;
-                       FDat := nil;
-               except
-               end;
-       end;
+       FreeDat;
 
        // \88ê\8e\9e\83t\83@\83C\83\8b\82Ì\8fê\8d\87\82Í\8dí\8f\9c\82·\82é
        if FIsTemporary then
@@ -346,20 +341,56 @@ var
        modified                        : Double;
        tmp                                             : PChar;
        downResult              : TStringList;
+       content                         : TStringList;
        responseCode    : Longint;
        logStream                       : TFileStream;
        uri                                             : TIdURI;
        uriList                         : TStringList;
        datURL                          : string;
        foundPos                        : Integer;
+       procedure       downAndParse;
+       begin
+               responseCode := InternalDownload( PChar( datURL ), modified, tmp, 0 );
+
+               try
+                       if responseCode = 200 then begin
+                               downResult      := TStringList.Create;
+                               try
+                                       downResult.Text := string( tmp );
+
+                                       // \83\8c\83X\82Ì\8aJ\8en\88Ê\92u
+                                       foundPos                                := Pos( '<dt', downResult.Text );
+                                       downResult.Text := Copy( downResult.Text, foundPos, Length( downResult.Text ) );
+                                       if foundPos > 0 then begin
+                                               // \83\8c\83X\82Ì\8fI\97¹\88Ê\92u
+                                               foundPos := Pos( '<table', downResult.Text ) - 1;
+                                               if foundPos > 0 then
+                                                       downResult.Text := Copy( downResult.Text, 1, foundPos );
+
+                                               // \82µ\82½\82ç\82Î\82Í dat \92¼\93Ç\82Ý\82ª\8fo\97\88\82È\82¢\82µ\81Acgi \88È\8aO\82É\8d·\95ª\93Ç\82Ý\8d\9e\82Ý\82Ì\95û\96@\82ª\82 \82é\82í\82¯\82Å\82à\96³\82¢\82Ì\82Å
+                                               // \91f\82Ì\82Ü\82Ü\82ð\96³\97\9d\82É\95Û\82Æ\82¤\82Æ\82Í\82¹\82¸\82É 2ch \82Ì dat \8c`\8e®\82É\95Ï\8a·\82µ\82½\82à\82Ì\82ð\95Û\91\82µ\82Ä\82µ\82Ü\82¤
+                                               WorkBegin( 2 );
+                                               Work( 1 );
+                                               To2chDat( downResult );
+                                               WorkEnd;
+                                               content.Text := content.Text + downResult.Text;
+                                       end;
+                               finally
+                                       downResult.Free;
+                               end;
+                       end else begin
+                               Result := dsNotModify;
+                               Exit;
+                       end;
+               finally
+                       DisposeResultString( tmp );
+               end;
+       end;
 begin
 
        Result := dsError;
 
-       if Copy( URL, Length( URL ), 1 ) = '/' then
-               uri := TIdURI.Create( URL )
-       else
-               uri := TIdURI.Create( URL + '/' );
+       uri := TIdURI.Create( ReadURL );
        uriList := TStringList.Create;
        try
                ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
@@ -374,78 +405,88 @@ begin
                        FilePath                        := MyLogFolder + uriList[ 3 ] + '\' + uriList[ 4 ] + '\' + uriList[ 5 ] + '.dat';
                        FIsTemporary    := False;
                end;
+       finally
+               uri.Free;
+               uriList.Free;
+       end;
 
+       content := TStringList.Create;
+       try
                // \95Û\91\97p\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\8c@\82é
                ForceDirectoriesEx( Copy( FilePath, 1, LastDelimiter( '\', FilePath ) ) );
 
-               if FileExists( FilePath ) then
-                       logStream := TFileStream.Create( FilePath, fmOpenReadWrite or fmShareDenyWrite )
-               else
-                       logStream := TFileStream.Create( FilePath, fmCreate or fmShareDenyWrite );
-               try
-                       // \93Æ\8e©\82É\83_\83E\83\93\83\8d\81[\83h\82â\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\8ds\82í\82È\82¢\8fê\8d\87\82Í
-                       // InternalDownload \82É\94C\82¹\82é\82±\82Æ\82ª\8fo\97\88\82é
-                       modified        := LastModified;
-                       datURL          :=
-                               uri.Protocol + '://' + uri.Host + '/bbs/read.cgi/' +
-                               uriList[ 3 ] + '/' + uriList[ 4 ] + '/' +
-                               uriList[ 5 ] + '/' + IntToStr( Count + 1 ) + '-n'; // \90V\92\85\82Ì\82Ý
-                       responseCode := InternalDownload( PChar( datURL ), modified, tmp, 0 );
-
-                       try
-                               if responseCode = 200 then begin
-                                       downResult := TStringList.Create;
-                                       try
-                                               downResult.Text := string( tmp );
-
-                                               // \83\8c\83X\82Ì\8aJ\8en\88Ê\92u
-                                               foundPos                                := Pos( '<dt', downResult.Text );
-                                               downResult.Text := Copy( downResult.Text, foundPos, Length( downResult.Text ) );
-                                               if foundPos > 0 then begin
-                                                       // \83\8c\83X\82Ì\8fI\97¹\88Ê\92u
-                                                       foundPos := Pos( '<table', downResult.Text ) - 1;
-                                                       if foundPos > 0 then
-                                                               downResult.Text := Copy( downResult.Text, 1, foundPos );
-
-                                                       // \82µ\82½\82ç\82Î\82Í dat \92¼\93Ç\82Ý\82ª\8fo\97\88\82È\82¢\82µ\81Acgi \88È\8aO\82É\8d·\95ª\93Ç\82Ý\8d\9e\82Ý\82Ì\95û\96@\82ª\82 \82é\82í\82¯\82Å\82à\96³\82¢\82Ì\82Å
-                                                       // \91f\82Ì\82Ü\82Ü\82ð\96³\97\9d\82É\95Û\82Æ\82¤\82Æ\82Í\82¹\82¸\82É 2ch \82Ì dat \8c`\8e®\82É\95Ï\8a·\82µ\82½\82à\82Ì\82ð\95Û\91\82µ\82Ä\82µ\82Ü\82¤
-                                                       WorkBegin( 2 );
-                                                       Work( 1 );
-                                                       To2chDat( downResult );
-                                                       WorkEnd;
-
-                                                       if downResult.Count > 0 then begin
-                                                               logStream.Position      := logStream.Size;
-                                                               logStream.Write( PChar( downResult.Text )^, Length( downResult.Text ) );
-
-                                                               if Count = 0 then
-                                                                       Result := dsComplete
-                                                               else
-                                                                       Result := dsDiffComplete;
-                                                               // CGI \82©\82ç\82Í\90³\82µ\82¢\93ú\95t\82ª\93¾\82ç\82ê\82È\82¢\82Ì\82Å\8c»\8dÝ\82É\90Ý\92è
-                                                               LastModified                            := Now;
-                                                               RoundDate                                               := Now;
-                                                               IsLogFile                                               := True;
-                                                               NewReceive                                      := Count + 1;
-                                                               Count                                                           := Count + downResult.Count;
-                                                               NewResCount                                     := downResult.Count;
-                                                       end;
-                                               end else begin
-                                                       Result := dsNotModify;
+               // \93Æ\8e©\82É\83_\83E\83\93\83\8d\81[\83h\82â\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\8ds\82í\82È\82¢\8fê\8d\87\82Í
+               // InternalDownload \82É\94C\82¹\82é\82±\82Æ\82ª\8fo\97\88\82é
+               modified        := LastModified;
+               datURL          := ReadURL + IntToStr( Max( 1, Count ) ) + '-n'; // \90V\92\85 - 1 \82©\82ç\8dÅ\8cã\82Ü\82Å
+               downAndParse;
+
+               if content.Count > 0 then begin
+                       LoadDat;
+
+                       if FDat = nil then begin
+                               Result := dsComplete;
+                               // \90V\8bK\8f\91\82«\8d\9e\82Ý
+                               logStream := TFileStream.Create( FilePath, fmCreate or fmShareDenyWrite );
+                               try
+                                       logStream.Position      := logStream.Size;
+                                       logStream.Write( PChar( content.Text )^, Length( content.Text ) );
+                               finally
+                                       logStream.Free;
+                               end;
+                               NewReceive      := 1;
+                               Count                           := content.Count;
+                       end else begin
+                               // \82 \82Ú\81[\82ñ\82ª\96³\82¢\82©\94ä\8ar\82·\82é
+                               if FDat[ FDat.Count - 1 ] = content[ 0 ] then begin
+                                       // \82 \82Ú\81[\82ñ\82ª\96³\82¢\82Ì\82Å\8fd\95¡\82ð\8dí\8f\9c
+                                       content.Delete( 0 );
+
+                                       if content.Count > 0 then begin
+                                               Result := dsDiffComplete;
+                                               // \92Ç\8bL
+                                               logStream := TFileStream.Create( FilePath, fmOpenReadWrite or fmShareDenyWrite );
+                                               try
+                                                       logStream.Position      := logStream.Size;
+                                                       logStream.Write( PChar( content.Text )^, Length( content.Text ) );
+                                               finally
+                                                       logStream.Free;
                                                end;
+                                               NewReceive      := Count + 1;
+                                               Count                           := Count + content.Count;
+                                       end else begin
+                                               Result := dsNotModify;
+                                       end;
+                               end else begin
+                                       Result := dsDiffComplete;
+                                       // \82 \82Ú\81[\82ñ\82ð\8c\9f\8fo\82µ\82½\82Ì\82Å\95s\91«\95ª\82ð\83_\83E\83\93\83\8d\81[\83h
+                                       modified        := LastModified;
+                                       datURL          := ReadURL +
+                                               IntToStr( 1 ) + '-' + IntToStr( Count - 1 ); // 1 \82©\82ç\90V\92\85 - 1 \82Ü\82Å
+                                       downAndParse;
+
+                                       // \8d·\95ª\8aÜ\82ß\90V\8bK\8f\91\82«\8d\9e\82Ý
+                                       logStream := TFileStream.Create( FilePath, fmCreate or fmShareDenyWrite );
+                                       try
+                                               logStream.Position      := logStream.Size;
+                                               logStream.Write( PChar( content.Text )^, Length( content.Text ) );
                                        finally
-                                               downResult.Free;
+                                               logStream.Free;
                                        end;
+                                       Count                           := content.Count;
+                                       NewReceive      := Count + 1;
                                end;
-                       finally
-                               DisposeResultString( tmp );
                        end;
-               finally
-                       logStream.Free;
+
+                       // CGI \82©\82ç\82Í\90³\82µ\82¢\93ú\95t\82ª\93¾\82ç\82ê\82È\82¢\82Ì\82Å\8c»\8dÝ\82É\90Ý\92è
+                       LastModified    := Now;
+                       RoundDate                       := Now;
+                       IsLogFile                       := True;
+                       NewResCount             := content.Count;
                end;
        finally
-               uri.Free;
-               uriList.Free;
+               content.Free;
+               FreeDat;
        end;
 
 end;
@@ -459,7 +500,6 @@ function    TShitarabaThreadItem.Write(
        inMessage                       : string        // \96{\95
 ) : TDownloadState;                            // \8f\91\82«\8d\9e\82Ý\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
 var
-       postURL                         : string;
        postData                        : string;
        postResult              : PChar;
        uri                                             : TIdURI;
@@ -472,10 +512,6 @@ begin
                ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
 
                // http://jbbs.shitaraba.com/bbs/read.cgi/game/1578/1067968274/l100
-               postURL         :=
-                       uri.Protocol + '://' + uri.Host + '/bbs/write.cgi/' +
-                       uriList[ 3 ] + '/' + uriList[ 4 ] + '/' +
-                       uriList[ 5 ] + '/';
                postData        :=
                        'NAME='                 + HttpEncode( SJIStoEUC( inName ) ) +
                        '&MAIL='                + HttpEncode( SJIStoEUC( inMail ) ) +
@@ -487,7 +523,7 @@ begin
                        '&submit='      + HttpEncode( SJIStoEUC( '\8f\91\82«\8d\9e\82Þ' ) );
 
                // \93Æ\8e©\82É\92Ê\90M\82µ\82È\82¢\8fê\8d\87\82Í InternalPost \82É\94C\82¹\82é\82±\82Æ\82ª\8fo\97\88\82é
-               InternalPost( PChar( postURL ), PChar( postData ), postResult );
+               InternalPost( PChar( WriteURL ), PChar( postData ), postResult );
                DisposeResultString( postResult );
 
                Result := dsComplete
@@ -511,21 +547,16 @@ begin
 
        // \93Æ\8e©\82É\83t\83B\83\8b\83^\83\8a\83\93\83O\82ð\8ds\82í\82È\82¢\8fê\8d\87\82Í
        // InternalAbon \82¨\82æ\82Ñ Dat2HTML \82É\94C\82¹\82é\82±\82Æ\82ª\8fo\97\88\82é
+       LoadDat;
        if FDat = nil then begin
-               if IsLogFile then begin
-                       // dat \82Ì\93Ç\82Ý\8d\9e\82Ý
-                       FDat                    := TStringList.Create;
-                       FDat.LoadFromFile( FilePath );
-               end else begin
-                       // \83\8d\83O\82É\91\8dÝ\82µ\82È\82¢\82Ì\82Å\82±\82Ì\82Ü\82Ü\8fI\97¹
-                       Result := '';
-                       Exit;
-               end;
+               // \83\8d\83O\82É\91\8dÝ\82µ\82È\82¢\82Ì\82Å\82±\82Ì\82Ü\82Ü\8fI\97¹
+               Result := '';
+               Exit;
        end;
-       res                     := FDat[ inNo - 1 ];
-       tmp                     := InternalAbon( PChar( res ) );
+       res := FDat[ inNo - 1 ];
+       tmp := InternalAbon( PChar( res ) );
        try
-               Result  := Dat2HTML( string( tmp ), inNo );
+               Result := Dat2HTML( string( tmp ), inNo );
        finally
                DisposeResultString( tmp );
        end;
@@ -548,19 +579,10 @@ begin
 
 
        // GetRes \82ð\8cÄ\82Î\82ê\82é\82±\82Æ\82ª\97\\91z\82³\82ê\82é\82Ì\82Å FDat \82ð\90\90¬\82µ\82Ä\82¨\82­
-       if FDat <> nil then begin
-               try
-                       FDat.Free;
-                       FDat := nil;
-               except
-               end;
-       end;
-       if IsLogFile then begin
-               // dat \82Ì\93Ç\82Ý\8d\9e\82Ý
-               FDat                    := TStringList.Create;
-               FDat.LoadFromFile( FilePath );
-
-               AllResCount := FDat.Count; // \96{\93\96\82Í\82±\82±\82Å\82â\82é\82×\82«\82Å\82Í\82È\82¢\82ª\8eÀ\8c±\82Ì\82½\82ß\82Ì\88ê\8e\9e\93I\82È\82à\82Ì
+       try
+               FreeDat;
+               LoadDat;
+       except
        end;
 
 end;
@@ -579,10 +601,7 @@ begin
 
        // \82à\82¤ GetRes \82Í\8cÄ\82Î\82ê\82È\82¢\82Æ\8ev\82¤\82Ì\82Å FDat \82ð\8aJ\95ú\82µ\82Ä\82¨\82­
        try
-               if FDat <> nil then begin
-                       FDat.Free;
-                       FDat := nil;
-               end;
+               FreeDat;
        except
        end;
 
@@ -597,10 +616,7 @@ var
        uriList                         : TStringList;
 begin
 
-       if Copy( URL, Length( URL ), 1 ) = '/' then
-               uri := TIdURI.Create( URL )
-       else
-               uri := TIdURI.Create( URL + '/' );
+       uri                     := TIdURI.Create( ReadURL );
        uriList := TStringList.Create;
        try
                ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
@@ -687,6 +703,89 @@ begin
 end;
 
 // *************************************************************************
+// FDat \82Ì\90\90¬
+// *************************************************************************
+procedure      TShitarabaThreadItem.LoadDat;
+begin
+
+       if FDat = nil then begin
+               if IsLogFile then begin
+                       // dat \82Ì\93Ç\82Ý\8d\9e\82Ý
+                       FDat := TStringList.Create;
+                       FDat.LoadFromFile( FilePath );
+               end;
+       end;
+
+end;
+
+// *************************************************************************
+// FDat \82Ì\8aJ\95ú
+// *************************************************************************
+procedure      TShitarabaThreadItem.FreeDat;
+begin
+
+       if FDat <> nil then begin
+               FDat.Free;
+               FDat := nil;
+       end;
+
+end;
+
+// *************************************************************************
+// \88À\91S\82È( '/' \82Å\8fI\82í\82é )\93Ç\82Ý\8d\9e\82Ý\82Ì URL
+// *************************************************************************
+function       TShitarabaThreadItem.ReadURL : string;
+var
+       uri                     : TIdURI;
+       uriList : TStringList;
+begin
+
+       if Copy( URL, Length( URL ), 1 ) = '/' then
+               uri := TIdURI.Create( URL )
+       else
+               uri := TIdURI.Create( URL + '/' );
+       uriList := TStringList.Create;
+       try
+               ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
+               // http://jbbs.shitaraba.com/bbs/read.cgi/game/1578/1067968274/l100
+               Result :=
+                       uri.Protocol + '://' + uri.Host + '/bbs/read.cgi/' +
+                       uriList[ 3 ] + '/' + uriList[ 4 ] + '/' + uriList[ 5 ] + '/';
+       finally
+               uri.Free;
+               uriList.Free;
+       end;
+
+end;
+
+// *************************************************************************
+// \88À\91S\82È( '/' \82Å\8fI\82í\82é )\8f\91\82«\8d\9e\82Ý\82Ì URL
+// *************************************************************************
+function       TShitarabaThreadItem.WriteURL : string;
+var
+       uri                     : TIdURI;
+       uriList : TStringList;
+begin
+
+       if Copy( URL, Length( URL ), 1 ) = '/' then
+               uri := TIdURI.Create( URL )
+       else
+               uri := TIdURI.Create( URL + '/' );
+       uriList := TStringList.Create;
+       try
+               ExtractHttpFields( ['/', '?'], [], uri.Path, uriList );
+               // http://jbbs.shitaraba.com/bbs/read.cgi/game/1578/1067968274/l100
+               Result          :=
+                       uri.Protocol + '://' + uri.Host + '/bbs/write.cgi/' +
+                       uriList[ 3 ] + '/' + uriList[ 4 ] + '/' + uriList[ 5 ] + '/';
+       finally
+               uri.Free;
+               uriList.Free;
+       end;
+
+end;
+
+// *************************************************************************
 // TThreadItem \82ª\90\90¬\82³\82ê\82½\8fê\8d\87\82Ì\8f\88\92u(TShitarabaThreadItem \82ð\90\90¬\82·\82é)
 // *************************************************************************
 procedure ThreadItemOnCreateOfTShitarabaThreadItem(
@@ -845,7 +944,7 @@ begin
 end;
 
 // *************************************************************************
-// \8f\91\82«\8d\9e\82Ý\82ð\8ew\8e¦\82³\82ê\82½
+// \83X\83\8c\97§\82Ä\82ð\8ew\8e¦\82³\82ê\82½
 // *************************************************************************
 function       TShitarabaBoardItem.CreateThread(
        inSubject                       : string;       // \83X\83\8c\83^\83C