質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • C#

    5753questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Slackからファイルをダウンロードするときの引数の設定で困っています。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 116

nomurax

score 24

前提・実現したいこと

こんにちは。いつもたいへんお世話になります。
本日はVisual Studio 2017 Communityで開発して困っていることがあります。

Slackからファイルをダウンロードするときの引数の設定で困っています。
https://github.com/Inumedia/SlackAPI
からAPI一式をダウンロードしてためしています。
画像のアップロードはできました。
そこで次にダウンロードしようと思っています。

namespace SlackAPI
{
    public partial class SlackClient
    {
        readonly string APIToken;
        public SlackClient(string token)
        {
            APIToken = token;
        }
    }
}
string token= "";
var slackclient = new Slack.SlackClient(token);
slackclient.GetFiles(null, "myid@mailaddress.com", DateTime.Now.AddDays(-5), DateTime.Now, 10);


これで初期化したあと、次のメソッドに飛びます。
このAction<FileListResponse> callbackになにを入れればよいのかを教えてほしいです。
とりあえずnullを入れてますが、うまくいっていないです。うまくいっていないというのは、ファイルをダウンロードするはずなのですが、処理が終わってしまってファイルをダウンロードしません。
Action<FileListResponse> callbackにはなにを渡したらよいでしょうか?
ちなみにUploadも同様にAction<FileUploadResponse> callbackという引数ですが、こちらはnullを渡してアップロードできました。

public void GetFiles(Action<FileListResponse> callback, string userId = null, DateTime? from = null, DateTime? to = null, int? count = null, int? page = null, FileTypes types = FileTypes.all)
{
    //この処理にいくようです。
            APIRequestWithToken(callback, parameters.ToArray());
}

この処理を経過して、
        public void APIRequestWithToken<K>(Action<K> callback, params Tuple<string,string>[] getParameters)
            where K : Response
        {
            Tuple<string, string>[] tokenArray = new Tuple<string, string>[]{
                new Tuple<string,string>("token", APIToken)
            };

            if (getParameters != null && getParameters.Length > 0)
                tokenArray = tokenArray.Concat(getParameters).ToArray();

            APIRequest(callback, tokenArray, new Tuple<string, string>[0]);
        }


//この処理にいきます。
public static void APIRequest<K>(Action<K> callback, Tuple<string, string>[] getParameters, Tuple<string, string>[] postParameters)
            where K : Response
{
    RequestPath path = RequestPath.GetRequestPath<K>();
    Uri requestUri = GetSlackUri(Path.Combine(APIBaseLocation, path.Path), getParameters);
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
    RequestState<K> state = new RequestState<K>(request, postParameters, callback);
    //このあたりで処理するのかと思うのですが、どこにどういくのか見失っています。
    state.Begin();
}

発生している問題・エラーメッセージ

callbackにとりあえずnullを入れてますが、うまくいっていないです。うまくいっていないというのは、ファイルをダウンロードするはずなのですが、処理が終わってしまってファイルをダウンロードしません。

補足情報(言語/FW/ツール等のバージョンなど)

Windows10 Home 1709 64bit

Microsoft Visual Studio Community 2017
Version 15.1 (26403.3) Release
VisualStudio.15.Release/15.1.0+26403.3
Microsoft .NET Framework
Version 4.7.02556

インストールされているバージョン:Community

Visual C# 2017   00369-60000-00001-AA631

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

C#のプログラム的な側面から回答いたします。
Slack APIの使用経験はありません。申し訳ありません。

以下のコードで動作しませんか?

        private void DownloadFiles()
        {
            string token = "";
            var slackclient = new Slack.SlackClient(token);
            // DownloadedCallbackをCallBack関数として渡す
            slackclient.GetFiles(new Action<FileListResponse>(DownloadedCallback), "myid@mailaddress.com", DateTime.Now.AddDays(-5), DateTime.Now, 10);
        }

        private void DownloadedCallback(FileListResponse response)
        {
            // この関数はダウンロードが終わったタイミングで呼び出されると思います。

            // 処理を記載してください。
            // Slack API のソースを確認したところFileListResponseクラスに、
            // ダウンロードされたファイルのインスタンス(SlackAPI.File[])が格納
            // されるようです。
            foreach (var file in response.files)
            {
                Console.WriteLine($"ID:{file.id}_Name:{file.name}_Size:{file.size / 1024}[KB]" );
            }
        }


うまく説明できませんが、コールバック関数とはなにか処理が終わった後(または処理している途中)などに実行される処理です。
質問の状態ではnomuraxさんがコールバック関数にnullを指定しているため、ダウンロード完了後に呼び出される関数が存在しないため、ダウンロードしていないように見えているだけだと思います。
(要するにダウンロードの指示を出して処理もしてるけど、指示した側が結果を確認できていない)
*アップロードが成功しているのは、アップロード完了後はCallBackがなくてもサーバ側にはファイルが送信されているからでしょう。

slackclient.GetFilesメソッドを呼び出したあと、callback引数に渡した関数が呼ばれることを確認してください。

最後に、"Action<FileListResponse> callback"とは、FileListResponse型の引数を持つ関数のデリゲートという意味です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5753questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。