兼業主夫 ときどき 指揮者 のち ギーク?

2009-01-28

それっぽくVisual C#版 Skype de TRPG 支援ツールが出来た

 Visual C#で、何とかそれっぽいツールを作ることが出来た。

 機能は「」とほぼ同じ。違うのはツール実行者の発言も拾ってくれることくらいである。

 まだC#はよく分からないし、SkypeAPIもいまいち分かっていないのだが、ネット上の情報を探りながら何とか出来た次第。

 とても「出来た!」とソースをお見せ出来る状態にはないのだが、より上を目指すためにもここに公開しておく。どう作るのがより良いのか、などはこれから学んでいくことにしよう。

参考サイト: Skype Community > c# using skype4com in threads

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SKYPE4COMLib;
using System.Threading;
using System.Collections;
using System.Text.RegularExpressions;

namespace SkypeDeTRPG
{
  public partial class MainForm : Form
  {
    private Skype skype = new Skype();
    private Chat chat;
    private string strMessage;
    private Hashtable htbThread = new Hashtable();
    
    public MainForm()
    {
      InitializeComponent();

      skype.MessageStatus += new _ISkypeEvents_MessageStatusEventHandler(skype_MessageStatus);
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
      try
      {
        if (!skype.Client.IsRunning)
        {
          skype.Client.Start(false, true);
        }
      }
      catch (Exception)
      {
        // All Skype Logic uses TRY for safety
      }

      try
      {
        //Skypeと接続
        skype.Attach(7, false);
      }
      catch (Exception)
      {
        //MessageBox.Show("Konnte nicht verbinden", "Verbindungsproblem", MessageBoxButtons.RetryCancel);

      }
    }

    void skype_MessageStatus(ChatMessage pMessage, TChatMessageStatus Status)
    {
      string outputMessage = "";
      string Name = "";

      if (pMessage.Status == TChatMessageStatus.cmsReceived || pMessage.Status==TChatMessageStatus.cmsSent)
      {
        chat = skype.get_Chat(pMessage.Chat.Name);
        strMessage = pMessage.Body.ToLower().ToString();
        Name = pMessage.FromDisplayName;

        if (strMessage.Substring(0, 4) == "サイコロ" || strMessage.Substring(0, 4) == "さいころ")
        {
          strMessage = strMessage.Replace("さいころ", ""); //トリガーとなる文字「さいころ」を削除
          strMessage = strMessage.Replace("サイコロ", ""); //トリガーとなる文字「サイコロ」を削除
          strMessage = strMessage.Replace(" ", "");    //空白を削除

          //全角→半角変換
          var str = "";
          var han = "0123456789-+Dd";
          var zen = "0123456789−+Dd";
          var c = "";
          var n = 0;
          string kekka = "";

          for (var i = 0; i < strMessage.Length; i++)
          {
            c = strMessage.Substring(i, 1);
            n = zen.IndexOf(c, 0);
            if (n >= 0) c = han.Substring(n, 1);
            str += c;
          }

          strMessage = str;
          strMessage = strMessage.ToLower();       //小文字に変換

          //サイコロを振る
          var temp = strMessage.Split('+');
          var total = 0;

          // Random クラスの新しいインスタンスを生成する
          Random cRandom = new System.Random();

          for (var i = 0; i < temp.Length; i++)
          {
            var kekkaTemp = 0;

            if (temp[i].IndexOf('d', 0) >= 0)
            {
              var dice = temp[i].Split('d');
              if (dice[0] == "") dice[0] = "1"; //省略された場合はダイス1つ
              for (int j = 0; j < int.Parse(dice[0]); j++)
              {
                if (dice[1] == "") dice[1] = "6"; //省略された場合は6面ダイス
                var rand = cRandom.Next(1, int.Parse(dice[1]));
                kekkaTemp = kekkaTemp + rand;
                total = total + rand; //合計の算出

                kekka = kekka + " と " + kekkaTemp;
              }
            }
            else
            {
              kekka = kekka + " に " + int.Parse(temp[i]) + " を足して";
              total = total + int.Parse(temp[i]); //合計の算出
            }
          }

          //結果出力
          if (total != 0)
          {
            kekka = kekka.Substring(3);
            if(kekka.IndexOf("を足して", 0) < 0) kekka = kekka + " で";

            outputMessage = '■' + Name + "さん> コロコロ…… " + kekka + " 合計 " + total + " です";

            //メッセージの出力
            chat.SendMessage(outputMessage.ToString());
          }
        }
      }
    }
  }
}

kidd-number5kidd-number5 2009/01/29 00:38 全半角置換はこんなロジックを使うとさくっと
http://investor.a-auc.jp/csharp.php?pd=strconv

hiko_shiko_s 2009/01/29 09:13 「VB.NETのStrConv関数をC#から呼び出す」手法については実は調べた結果行き当たっていたのですが、「できる」こととトレードオフになるものがあるのでは? と思ってとりあえず現行(スクリプト版)通りにしたのでした。「重くなる」とか「環境を選ぶ」とかになると嫌だなぁ、と思ったので。
いろいろ調べてみて、問題ないようならそのうち差し替えます。

myamya19701022myamya19701022 2009/01/30 12:55 ふとおもったんだけどさ。
さいころ2d+d とかやったらエラーになんない?

hiko_shiko_s 2009/01/30 19:12 そこは大丈夫です。サイコロの数を省略したら自動的に1個、何面体かを省略したら自動的に6面体として処理します。
「d」であれは問題ないのですが、「サイコロ2d+a」とか「サイコロdc」とかやったらエラーになります(苦笑)<アップしてませんがローカルでは修正済み

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hiko_s/20090128/p2
リンク元
Connection: close