OSDN Git Service

[YCへマージ]
[winbottle/winbottle.git] / bottleclient / MainForm.pas
index cfd56b9..e98499f 100755 (executable)
@@ -174,8 +174,8 @@ type
     mnUndo: TMenuItem;
     mnRedo: TMenuItem;
     N9: TMenuItem;
-    ScriptBackUp: TTimer;
     mnPresetReplaceRoot: TMenuItem;
+    ScriptBackup: TTimer;
     OpenDialog: TOpenDialog;
     mnFileOpen: TMenuItem;
     actFileOpen: TAction;
@@ -280,7 +280,7 @@ type
     procedure actUndoExecute(Sender: TObject);
     procedure actRedoExecute(Sender: TObject);
 //    procedure IdSLPP20ConnectFailed(Sender: TObject);
-    procedure ScriptBackUpTimer(Sender: TObject);
+    procedure ScriptBackupTimer(Sender: TObject);
     procedure actFileOpenExecute(Sender: TObject);
     procedure actFileSaveAsExecute(Sender: TObject);
     procedure actFileSaveExecute(Sender: TObject);
@@ -304,7 +304,10 @@ type
 //                              // \83\8d\81[\83J\83\8b\8am\94F\8b­\90§\97p\83t\83\89\83O\81BTRichEdit.Modified\82Í
 //                              //\95Ê\82Ì\97p\93r\82Å\8eg\82Á\82Ä\82¢\82é\82Ì\82Å\8eg\82¦\82È\82¢
     //
-    FScriptBackModified: boolean; //\83X\83N\83\8a\83v\83g\8e©\93®\95Û\91\83t\83\89\83O
+    FScriptBackupModified: boolean; // \83X\83N\83\8a\83v\83g\83o\83b\83N\83A\83b\83v\83t\83\89\83O
+    FScriptBackupFile: string;      // \8c»\8dÝ\82Ì\83o\83b\83N\83A\83b\83v\83t\83@\83C\83\8b\96¼
+    FScriptBackupDir: string;       // \83o\83b\83N\83A\83b\83v\90æ\82Ì\83t\83H\83\8b\83_\96¼
+    //
     FFileModified: boolean;       //\83t\83@\83C\83\8b\93à\97e\82ª\95Ï\8dX\82³\82ê\82Ä\82¢\82é\82©\81B
     FFileName: string;            //\90V\8bK\82©\8aù\91\83t\83@\83C\83\8b\82Ì\94»\92f\81A\82Ü\82½\82Í\8aù\91\83t\83@\83C\83\8b\82Ì\8fê\8f\8a
     //
@@ -381,7 +384,7 @@ type
     procedure AppendTextLog(const FileName, Line: String; FAppend: boolean);
     procedure AppendXMLLog(const FileName: String; Args: THeadValue);
     //\8e©\93®\95Û\91\90Ý\92è
-    procedure SetScriptAutoBackUp;
+    procedure SetScriptAutoBackup;
     //\92P\91Ì\83t\83@\83C\83\8b\93ü\8fo\97Í\8aÖ\8cW
     procedure PerformFileOpen(const AFileName: string);
     procedure PerformFileSave(const AFileName: string);
@@ -391,7 +394,8 @@ type
     function FileSaveAs(Sender: TObject): integer;
     procedure EditerStatusChange;
     procedure SetFileModified(Value: boolean);
-    function CheckFileExt(const AFileName: string): boolean;
+    function CheckFileExt(const FileName: string): boolean;
+    procedure DeleteBackupFile(const FileName: string);
 
   protected
     procedure WndProc(var Message: TMessage); override;
@@ -446,7 +450,7 @@ const
 
   SendButtonLongHint = 'Bottle\82Ì\91\97\90M';
   NewFileTitle       = '\96¼\8fÌ\96¢\92è';     // \90V\8bK\83^\83C\83g\83\8b
-  AutoSaveFile       = 'Script.bak';   // FileCheck\8ew\92è\82Ì\8ag\92£\8eq\82ð\8eg\82¤
+  StdBackupFile      = 'Script.bak';   // FileCheck\8ew\92è\82Ì\8ag\92£\8eq\82ð\8eg\82¤
 
 function Token(const Str: String; const Delimiter: char;
   const Index: integer): String;
@@ -587,6 +591,7 @@ begin
   Spps.LoadFromDirectory(FSppDir);
   ConstructMenu(false);
   BuildReplaceMenu(mnPresetReplaceRoot);
+  FScriptBackupDir := ExtractFileDir(Application.ExeName) + '\temp\';
 
   Str := TStringList.Create;
   try
@@ -1035,7 +1040,7 @@ begin
   Self.Show;
   SakuraSeeker.BeginDetect;
   SakuraSeekerDetectResultChanged(self);
-  SetScriptAutoBackUp;                      // \8e©\93®\95Û\91\90Ý\92è\82Ì\83\8d\81[\83h
+  SetScriptAutoBackup;                      // \8e©\93®\95Û\91\90Ý\92è\82Ì\83\8d\81[\83h
 {
   if (SakuraSeeker.Count = 0) and (Pref.NotWarnGhostIsntExists = False) then
     frmMessageBox.ShowMessage('\83S\81[\83X\83g(SSTP\83T\81[\83o)\82ª1\82Â\82à\8bN\93®\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B'#13#10 +
@@ -1075,7 +1080,7 @@ procedure TfrmSender.memScriptChange(Sender: TObject);
 begin
   //\83G\83f\83B\83^\93à\97e\82ª\95Ï\8dX\82³\82ê\82½\82Æ\82«
   EditerStatusChange;             // \83X\83e\81[\83^\83X\8dX\90V\82Ö
-  FScriptBackModified := true;    // \8e©\93®\95Û\91\8dÄ\8aJ
+  FScriptBackupModified := true;  // \8e©\93®\95Û\91\8dÄ\8aJ
   SetFileModified(true);          // \83t\83@\83C\83\8b\95Ï\8dX\83t\83\89\83O
 end;
 
@@ -1549,15 +1554,24 @@ begin
         //\83\81\83b\83Z\81[\83W\8eó\90M
         DispatchBottle(EventType, HeadValue);
       end;
+
       etMemberCount: begin
+        //\91\8d\8eQ\89Á\8eÒ\90\94
         StatusBar.Panels[PanelMembers].Text := HeadValue['Num'] + '\90l'
       end;
+
       etChannelCount: begin
+        //\83`\83\83\83\93\83l\83\8b\95Ê\8eQ\89Á\8eÒ\90\94
         try
-          ChannelList.Channel[HeadValue['Channel']].Members := StrToInt(HeadValue['Num']);
+          if HeadValue['Channel'] <> '' then begin
+            if ChannelList.Channel[HeadValue['Channel']] <> nil then begin
+              ChannelList.Channel[HeadValue['Channel']].Members := StrToInt(HeadValue['Num']);
+            end;
+          end;
         except
         end;
       end;
+
       etConnectOk: begin
         ShowHintLabel('SSTP Bottle\83T\81[\83o\82Æ\92Ê\90M\8am\97§\81B');
         Added := true;
@@ -1565,34 +1579,50 @@ begin
         //\83`\83\83\83\93\83l\83\8b\8e©\93®\93o\98^
         if not Connecting then
           PostCommand(['Command: getChannels']);
-        SakuraSeeker.BeginDetect;
+        try
+          SakuraSeeker.BeginDetect;
+        except
+          on E: Exception do ShowHintLabel(E.Message,WarningColor);
+        end;
       end;
+
       etChannelList: begin
         UpdateJoinChannelList(HeadValue);
         // \8dÅ\8cã\82É\8eQ\89Á\82µ\82Ä\82¢\82½\83`\83\83\83\93\83l\83\8b\82ð\8bL\98^\82·\82é
         if JoinChannelsBackup = nil then JoinChannelsBackup := TStringList.Create;
         JoinChannelsBackup.Assign(JoinChannels);
       end;
+
       etCloseChannel: begin
-        with JoinChannels do
-          if IndexOf(HeadValue['Channel']) >= 0 then
-            Delete(IndexOf(HeadValue['Channel']));
-        with tabChannel do begin
-          if Tabs.IndexOf(HeadValue['Channel']) >= 0 then
-            Tabs.Delete(Tabs.IndexOf(HeadValue['Channel']));
-          if Tabs.Count > 0 then TabIndex := 0 else TabIndex := -1;
-          tabChannelChange(self);
+        //\83`\83\83\83\93\83l\83\8b\94p\8e~
+        if HeadValue['Channel'] <> '' then begin
+          with JoinChannels do
+            if IndexOf(HeadValue['Channel']) >= 0 then
+              Delete(IndexOf(HeadValue['Channel']));
+          with tabChannel do begin
+            if Tabs.IndexOf(HeadValue['Channel']) >= 0 then
+              Tabs.Delete(Tabs.IndexOf(HeadValue['Channel']));
+            if Tabs.Count > 0 then TabIndex := 0 else TabIndex := -1;
+            tabChannelChange(self);
+          end;
+          ShowHintLabel(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½',
+                        WarningColor);
+          frmLog.AddCurrentSystemLog('SYSTEM', HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
+          frmMessageBox.ShowMessage(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
         end;
-        ShowHintLabel(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½',
-                      WarningColor);
-        frmLog.AddCurrentSystemLog('SYSTEM', HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
-        frmMessageBox.ShowMessage(HeadValue['Channel'] + '\83`\83\83\83\93\83l\83\8b\82Í\94p\8e~\82³\82ê\82Ü\82µ\82½');
       end;
+
       etForceBroadcastInformation: begin
-        if HeadValue['Type'] = 'Vote' then begin
-          frmLog.VoteLog(HeadValue['MID'], StrToIntDef(HeadValue['Num'], 0));
-        end else if HeadValue['Type'] = 'Agree' then begin
-          frmLog.AgreeLog(HeadValue['MID'], StrToIntDef(HeadValue['Num'], 0));
+        //\93\8a\95[\81^\93¯\88Ó\81^\82»\82Ì\91¼\83u\83\8d\81[\83h\83L\83\83\83X\83g\8fî\95ñ
+        if HeadValue['MID'] <> '' then begin
+          try //Num\82ª\90\94\92l\82Å\82È\82©\82Á\82½\82Æ\82«\91Î\8dô
+            if HeadValue['Type'] = 'Vote' then begin
+              frmLog.VoteLog(HeadValue['MID'], StrToIntDef(HeadValue['Num'], 0));
+            end else if HeadValue['Type'] = 'Agree' then begin
+              frmLog.AgreeLog(HeadValue['MID'], StrToIntDef(HeadValue['Num'], 0));
+            end;
+          except
+          end;
         end;
       end;
     end;
@@ -1615,7 +1645,10 @@ begin
 end;
 
 procedure TfrmSender.actSettingExecute(Sender: TObject);
+var
+  FTBackupMode: boolean;
 begin
+  FTBackupMode := Pref.ScriptBackupMode;
   Application.CreateForm(TfrmSetting, frmSetting);
   try
     frmSetting.Execute;
@@ -1630,8 +1663,12 @@ begin
   UpdateLayout;
   tabChannel.Repaint;
   frmLog.UpdateWindow;
-  SetScriptAutoBackUp;  //\83X\83N\83\8a\83v\83g\8e©\93®\95Û\91\90Ý\92è\8dX\90V
+  SetScriptAutoBackup;  //\83X\83N\83\8a\83v\83g\8e©\93®\95Û\91\90Ý\92è\8dX\90V
   UpdateChannelList;    //\83`\83\83\83\93\83l\83\8b\83S\81[\83X\83g\8dÄ\83\8d\81[\83h
+
+  // \83o\83b\83N\83A\83b\83v\83\82\81[\83h\82ª\95Ï\8dX\82³\82ê\82½\82Æ\82«FScriptBackupFile\82à\95Ï\8dX\82·\82é
+  if FTBackupMode <> Pref.ScriptBackupMode then
+    SetFileName(FFileName, false);
 end;
 
 procedure TfrmSender.memScriptKeyPress(Sender: TObject; var Key: Char);
@@ -1768,8 +1805,9 @@ begin
     Tabs.Clear;
     for i := 0 to JoinChannels.Count-1 do begin
       //\8eó\90M\90ê\97p\83`\83\83\83\93\83l\83\8b\82Í\95\\8e¦\82µ\82È\82¢
-      if not ChannelList.Channel[JoinChannels[i]].NoPost then
-        Tabs.Add(JoinChannels[i]);
+      if ChannelList.Channel[JoinChannels[i]] <> nil then
+        if not ChannelList.Channel[JoinChannels[i]].NoPost then
+          Tabs.Add(JoinChannels[i]);
     end;
     Tabs.EndUpdate;
     // \8c³\82©\82ç\83`\83\83\83\93\83l\83\8b\82É\8eQ\89Á\82µ\82Ä\82¢\82½\8fê\8d\87\82Í
@@ -1847,10 +1885,11 @@ var Opt: TSstpSendOptions;
     CueItem: TLogItem;
     ReplaceHash: THeadValue;
 begin
+  Channel := Dat['Channel'];
+
   Opt := [];
   if Pref.NoTranslate then Opt := Opt + [soNoTranslate];
   if Pref.NoDescript  then Opt := Opt + [soNoDescript];
-  Channel := Dat['Channel'];
 {
   case EventType of
     etScript: Sender := Channel;
@@ -2337,10 +2376,17 @@ begin
     exit;
   end;
   if (not Pref.ConfirmOnExit) or FEndSession then
+  begin
+    DeleteBackupFile(FScriptBackupFile); // \88ê\8e\9e\83t\83@\83C\83\8b\8dí\8f\9c\82Ö
     Exit;
+  end;
   if MessageDlg('Yasagure Client\82ð\8fI\97¹\82µ\82Ü\82·', mtConfirmation,
                 mbOkCancel, 0) = mrCancel then
-    CanClose := false;
+    begin
+      CanClose := false;
+      exit;
+    end;
+  DeleteBackupFile(FScriptBackupFile);   // \88ê\8e\9e\83t\83@\83C\83\8b\8dí\8f\9c\82Ö
 end;
 
 procedure TfrmSender.UpdateIfGhostBox;
@@ -3177,9 +3223,9 @@ begin
   frmSender.actClear.Execute; // \8c»\8dÝ\82Ì\83X\83N\83\8a\83v\83g\82ð\83N\83\8a\83b\83v\82·\82é(\90Ý\92è\82É\82æ\82Á\82Ä)
   memScript.Lines.Clear;
   memScript.Lines.Add(Log.Script);
-  SetFileName(Log.MID, false);  //\83^\83C\83g\83\8b\82¾\82¯\95Ï\8dX
-  SetFileModified(false);       //\95Ï\8dX\96³\82µ\82É
-  FScriptBackModified := false; //\8e©\93®\95Û\91\88ê\8e\9e\92â\8e~
+  SetFileName(Log.MID, false);    //\83^\83C\83g\83\8b\82¾\82¯\95Ï\8dX
+  SetFileModified(false);         //\95Ï\8dX\96³\82µ\82É
+  FScriptBackupModified := false; //\8e©\93®\95Û\91\88ê\8e\9e\92â\8e~
   Ghost := Log.Ghost;
   //\83`\83\83\83\93\83l\83\8b\83S\81[\83X\83g\91Î\8dô
   if Ghost = '' then
@@ -3251,10 +3297,12 @@ begin
 
   if Visible then memScript.SetFocus;
 //  FScriptModified := false;
-  FScriptBackModified := false;     // \8e©\93®\95Û\91\88ê\8e\9e\92â\8e~
-  SetFileName(NewFileTitle, true);  // \83t\83@\83C\83\8b\82ð\90V\8bK\88µ\82¢\82É\82·\82é
-  SetFileModified(false);           // \95Ï\8dX\96³\82µ
-  EditerStatusChange;               // \83X\83e\81[\83^\83X\8dX\90V
+
+  DeleteBackupFile(FScriptBackupFile);  // \88ê\8e\9e\83t\83@\83C\83\8b\8dí\8f\9c\82Ö
+  FScriptBackupModified := false;     // \8e©\93®\95Û\91\88ê\8e\9e\92â\8e~
+  SetFileName(NewFileTitle, true);    // \83t\83@\83C\83\8b\82ð\90V\8bK\88µ\82¢\82É\82·\82é
+  SetFileModified(false);             // \95Ï\8dX\96³\82µ
+  EditerStatusChange;                 // \83X\83e\81[\83^\83X\8dX\90V
 end;
 
 procedure TfrmSender.AppendTextLog(const FileName, Line: String; FAppend: boolean);
@@ -3265,8 +3313,7 @@ begin
   try
     ForceDirectories(ExtractFileDir(FileName));
     AssignFile(F, FileName);
-    // if FileExists(FileName) AND FAppend then  // \92Ç\8bL\82©\8fã\8f\91\82«\94»\92è
-    if FileExists(FileName) then
+    if FileExists(FileName) AND FAppend then  // \92Ç\8bL\82©\8fã\8f\91\82«\94»\92è
       Append(F)
     else
       Rewrite(F);
@@ -3536,25 +3583,27 @@ begin
   end;
 end;
 
-procedure TfrmSender.SetScriptAutoBackUp;
+procedure TfrmSender.SetScriptAutoBackup;
 begin
   //\83o\83b\83N\83A\83b\83v\83^\83C\83}\81[\82Ö\92l\82Ì\83Z\83b\83g
-  frmSender.ScriptBackUp.Enabled := Pref.ScriptBackUp;
-  frmSender.ScriptBackUp.Interval := Pref.ScriptBackUpTime * 60000;
+  frmSender.ScriptBackup.Enabled := Pref.ScriptBackup;
+  frmSender.ScriptBackup.Interval := Pref.ScriptBackupTime * 60000;
 end;
 
-procedure TfrmSender.ScriptBackUpTimer(Sender: TObject);
+procedure TfrmSender.ScriptBackupTimer(Sender: TObject);
 var
   Script: string;
 begin
-  //\83X\83N\83\8a\83v\83g\82Ì\8e©\93®\83o\83b\83N\83A\83b\83v
-  if FScriptBackModified then
+  // \83X\83N\83\8a\83v\83g\82Ì\83o\83b\83N\83A\83b\83v
+  if FScriptBackupModified then
   begin
     Script := FormatDateTime('yy/mm/dd hh:nn:ss', Now) + #13#10 + GetScriptText;
-    AppendTextLog(ExtractFilePath(Application.ExeName) + AutoSaveFile,
-      Script, Pref.ScriptBackUpMode);
+
+    AppendTextLog(FScriptBackupDir + FScriptBackupFile, Script,
+      not Pref.ScriptBackupMode);
+
     ShowHintLabel('\83o\83b\83N\83A\83b\83v\8eÀ\8ds');
-    FScriptBackModified := False;
+    FScriptBackupModified := False;
   end;
 end;
 
@@ -3651,11 +3700,21 @@ begin
 end;
 
 procedure TfrmSender.SetFileName(const FileName: string; Value: boolean);
+var
+  FPath: string;
 begin
   // \83^\83C\83g\83\8b\95Ï\8dX\82Æ\83t\83@\83C\83\8b\83p\83X\83Z\83b\83g
   // \82à\82µ\81A\91æ\93ñ\88ø\90\94\82ªfalse\82È\82ç\83^\83C\83g\83\8b\82¾\82¯\95Ï\8dX
-  if Value then FFileName := FileName;
-  Self.Caption := Format('%s - %s', [ExtractFileName(FileName), FOriginalCaption]);
+  if Value then
+    FFileName := FileName;
+
+  FPath := ExtractFileName(FileName);
+
+  if Pref.ScriptBackupMode then
+    FScriptBackupFile := FormatDateTime('yymmddhhnnss', Now) + FPath
+  else
+    FScriptBackupFile := StdBackupFile;
+  Self.Caption := Format('%s - %s', [FPath, FOriginalCaption]);
 end;
 
 function TfrmSender.CheckFileModified(Sender: TObject): integer;
@@ -3753,13 +3812,13 @@ begin
   end;
 end;
 
-function TfrmSender.CheckFileExt(const AFileName: string): boolean;
+function TfrmSender.CheckFileExt(const FileName: string): boolean;
 var
   Res: boolean;
 begin
   // \8ag\92£\8eq.bak\82Ì\83t\83@\83C\83\8b\82Í\93Ç\8f\91\82«\82µ\82È\82¢\81B
   Res := true;
-  if LowerCase(ExtractFileExt(AFileName)) = '.bak' then
+  if LowerCase(ExtractFileExt(FileName)) = '.bak' then  // StdBackupFile\82Æ\93¯\8ag\92£\8eq
   begin
     beep;
     ShowMessage('\8ag\92£\8eqbak\82Í\88µ\82¦\82Ü\82¹\82ñ\81B'#13#10 + '\91¼\82Ì\83G\83f\83B\83^\82ð\8eg\97p\82µ\82Ä\82­\82¾\82³\82¢\81B');
@@ -3768,6 +3827,24 @@ begin
   Result := Res;
 end;
 
+procedure TfrmSender.DeleteBackupFile(const FileName: string);
+var
+  FPath: string;
+begin
+  // \8fã\8f\91\95Û\91\82Ì\88ê\8e\9e\83t\83@\83C\83\8b\82ð\8dí\8f\9c
+  if not Pref.ScriptBackupMode or (FileName = '') or
+    (StdBackupFile = FileName) then exit;
+
+  FPath := FScriptBackupDir + FileName;
+  try
+    if FileExists(FPath) then
+      DeleteFile(FPath);
+  except
+    on E: Exception do
+      ShowMessage('\88ê\8e\9e\83t\83@\83C\83\8b\8dí\8f\9c\83G\83\89\81[:'#13#10#13#10 + E.Message);
+  end;
+end;
+
 {$IFDEF PASS}
 procedure TfrmSender.CopyDataMessage(var WMCopyData: TWMCopyData);
 var