示例#1
0
        /// <summary>
        /// 构建附件消息
        /// </summary>
        /// <param name="attachmentInfo">附件信息</param>
        /// <param name="text">消息</param>
        /// <returns>聊天消息</returns>
        public static ChatMessage BuildAttachmentMessage(UploadedAttachmentInfo attachmentInfo, string text = " ")
        {
            var message = new ChatMessage();

            message.Text = text;
            message.Ent  = new List <EntMessage>();
            message.Fmt  = new List <FmtMessage>();

            //设置附件信息
            message.Ent.Add(new EntMessage()
            {
                Tp   = "EX",
                Data = new EntData()
                {
                    Mime = attachmentInfo.Mime,
                    Name = attachmentInfo.FileName,
                    Ref  = attachmentInfo.RelativeUrl,
                    Size = int.Parse(attachmentInfo.Size.ToString()),
                }
            });

            //设置附件说明消息范围
            message.Fmt.Add(new FmtMessage()
            {
                At  = text.Length,
                Len = 1,
                Key = 0,
            });

            //格式转换
            if (text.Contains("\n"))
            {
                for (int i = 0; i < text.Length; i++)
                {
                    if (text[i] == '\n')
                    {
                        FmtMessage fmt = new FmtMessage()
                        {
                            At = i, Tp = "BR", Len = 1
                        };
                        message.Fmt.Add(fmt);
                    }
                }
            }
            return(message);
        }
示例#2
0
        /// <summary>
        /// append a attachment file to chat message
        /// </summary>
        /// <param name="attachmentInfo">attachment file information, you can get it with ChatBot.Upload(...)</param>
        public void AppendAttachment(UploadedAttachmentInfo attachmentInfo)
        {
            Message.Fmt.Add(new FmtMessage()
            {
                At  = Message.Text.Length,
                Key = Message.Ent.Count,
                Len = 1,
            });

            Message.Ent.Add(new EntMessage()
            {
                Tp   = "EX",
                Data = new EntData()
                {
                    Mime = attachmentInfo.Mime,
                    Name = attachmentInfo.FileName,
                    Ref  = attachmentInfo.RelativeUrl,
                    Size = int.Parse(attachmentInfo.Size.ToString()),
                },
            });
        }
示例#3
0
        /// <summary>
        /// upload large file as attachment
        /// </summary>
        /// <param name="fileName">the file will be uploaded</param>
        /// <param name="redirectUrl">if upload operation should temp changed</param>
        /// <returns>uploaded information for send message to user or group</returns>
        public async Task <UploadedAttachmentInfo> Upload(string fileName, string redirectUrl = "")
        {
            if (string.IsNullOrEmpty(token))
            {
                //not login or login failed, disable upload
                Log("Upload Attachment Error", $"Not login, upload operation disabled...");
                return(null);
            }
            if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName))
            {
                Log("Upload Attachment Error", $"can not find file:{fileName}");
                return(null);
            }
            try
            {
                var fullFileName = Path.GetFullPath(fileName);
                var fileInfo     = new FileInfo(fullFileName);

                UploadedAttachmentInfo attachmentInfo = new UploadedAttachmentInfo();
                attachmentInfo.FullFileName = fullFileName;
                attachmentInfo.FileName     = fileInfo.Name;
                attachmentInfo.Size         = fileInfo.Length;
                attachmentInfo.Mime         = $"file/{fileInfo.Extension}";

                var         restClient = new RestClient(apiBaseUrl);
                RestRequest request;
                if (string.IsNullOrEmpty(redirectUrl))
                {
                    request = new RestRequest(UploadEndpoint, Method.Put);
                }
                else
                {
                    request = new RestRequest(redirectUrl, Method.Put);
                }

                request.AddHeader("X-Tinode-APIKey", apiKey);
                request.AddHeader("X-Tinode-Auth", $"Token {token}");
                request.AddBody("id", GetNextTid());

                request.AddFile("file", fullFileName);
                var cancellationTokenSource = new CancellationTokenSource();
                var response = await restClient.ExecuteAsync(request, cancellationTokenSource.Token);

                if (response.StatusCode >= HttpStatusCode.OK && response.StatusCode < HttpStatusCode.BadRequest)
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        var obj  = JsonConvert.DeserializeObject <JToken>(response.Content);
                        var code = obj["ctrl"]["code"].ToString();
                        var url  = obj["ctrl"]["params"]["url"].ToString();
                        attachmentInfo.RelativeUrl = url;

                        Log("Upload Attachment Success", $"Upload file success, File={fullFileName}, RefUrl={url}");
                        return(attachmentInfo);
                    }
                    else if (response.StatusCode == HttpStatusCode.TemporaryRedirect)
                    {
                        var tmpRedirectUrl = string.Empty;
                        //307,should reupload to the redirect url
                        foreach (var h in response.Headers)
                        {
                            //查找重定向地址
                            if (h.Name.ToLower() == "location")
                            {
                                tmpRedirectUrl = h.Value.ToString();
                                break;
                            }
                        }
                        Log("Upload Attachment Redirect", $"redirect upload...");
                        return(await Upload(fileName, redirectUrl));
                    }
                    else
                    {
                        Log("Upload Attachment Error", $"Upload failed, Http Code={response.StatusCode}");
                        return(null);
                    }
                }
                else
                {
                    //Failed
                    Log("Upload Attachment Error", $"Upload failed, Http Code={response.StatusCode}");
                    return(null);
                }
            }
            catch (Exception e)
            {
                //exception occurs
                Log("Upload Attachment Exception", $"Upload failed, Exception={e.Message}");
                return(null);
            }
        }