private static void Main(string[] args) { var url = "https://service.synerdocs.ru/exchangeservice.svc"; var appId = new Guid().ToString(); var login = "******"; var password = "******"; var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService"); // авторизуемся по логину и паролю, получаем токен if (client.Authenticate(login, password, appId)) { Console.WriteLine("Успешная авторизация по логину и паролю, получен токен:"); Console.WriteLine(client.Token); } else { Console.WriteLine("Ошибка авторизации, неверный логин или пароль?"); } var boxInfo = client.GetBoxes().FirstOrDefault(); if (boxInfo == null) { Console.WriteLine("Ошибка при получении ящиков"); return; } // текущий ящик == наш ящик var currentBox = boxInfo.Address; Console.WriteLine(currentBox); // получаем список исходящих документов var docs = client.GetDocumentList(new DocumentListOptions { // ! для того, чтобы выбрать входящие документы, необходимо указать в поле BoxTo - наш ящик BoxTo = null, // отправленных от нашего ящика BoxFrom = currentBox, // начать с этого индекса для постраничной выборки элементов First = 0, // кол-во элементов на странице Max = 10 }); Console.WriteLine(docs.Total); foreach (var doc in docs.Items) Console.WriteLine(doc.Name); Console.WriteLine("Для выхода нажмите enter"); Console.ReadLine(); }
/// <summary> /// Пример авторизации по сертификату /// получение данных по ИНН об организации-получателе /// отправка документа с подписью сертификатом пользователя /// отправка документ без подписания /// </summary> /// <param name="args"></param> private static void Main(string[] args) { var url = "https://service.synerdocs.ru/exchangeservice.svc"; var appId = new Guid().ToString(); var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService"); // авторизация по логину и паролю (тут возможно использовать также // авторизацию по сертификату при необходимости) var login = "******"; var password = "******"; if (client.Authenticate(login, password)) { Console.WriteLine("Успешная авторизация, получен токен:"); Console.WriteLine(client.Token); } else { Console.WriteLine("Ошибка авторизации"); Console.ReadKey(); return; } // получение текущего ящика var currentBoxInfo = client.GetBoxes().FirstOrDefault(); if (currentBoxInfo == null) { Console.WriteLine("Ошибка при получении ящиков"); return; } // выбор текущего ящика - от него будем отправлять документы // в простом случае - у пользователя доступен только один ящик // а если пользователь состоит в нескольких организациях - ящиков может быть несколько var currentBox = currentBoxInfo.Address; // ранее сохраненный или полученный ИД документа внутри сообщения, доступного для текущего авторизованного пользователя: // ИД документа - может быть и в формате "50008423799c4c82944b5b82c38be02e" var documentId = "50008423-799c-4c82-944b-5b82c38be02e"; try { // получение тела (бинарного содержимого) документа var documentContent = client.GetDocumentContent(currentBox, documentId); Console.WriteLine("Получено содержимое документа NBytes=" + documentContent.Length); // запрос информации о документе с указаним того, какую информацию необходимо получить var docInfo = client.GetFullDocumentInfo(currentBox, documentId, new FullDocumentInfoRequestParams { GetCard = true, GetContent = false, GetRelatedDocuments = true, GetServiceDocuments = true, GetSigns = true }); if (docInfo != null) { Console.WriteLine("Получена информация о документе"); // получении информации о сообщении документооборота, в которое входит документ var messageId = docInfo.MessageId; var message = client.GetMessage(currentBox, messageId); if (message != null) Console.WriteLine("Получена информации о сообщении документооборота"); } // получение полной информации о документе включая информацию документооборотам и вхождениям, // с указаним того, какую информацию необходимо получить // результат метода дублирует информацию, которую можно получать из других методов API // например информацию о подписях и т.д. var flowDocumentInfo = client.GetFlowDocumentInfo(currentBox, documentId, new FlowDocumentInfoRequestParams { GetSigns = true, GetServiceDocuments = true, GetRelatedDocuments = true, FlowResult = DocumentFlowResultMode.FullInfo }); if (flowDocumentInfo != null) Console.WriteLine("Получена информация о документе с докуметооборотами"); } catch (Exception ex) { Console.WriteLine("Произошла ошибка" + ex.GetType() + " " + ex.Message); Console.ReadKey(); return; } Console.WriteLine("Для выхода нажмите enter"); Console.ReadLine(); }
/// <summary> /// Пример авторизации по сертификату /// получение данных по ИНН об организации-получателе /// отправка документа с подписью сертификатом пользователя /// отправка документов без подписания /// /// отправка идет так: /// /// сообщение1 - получателю1 без указания подразления /// документ1 /// документ2 /// </summary> /// <param name="args"></param> private static void Main(string[] args) { var url = "https://service.synerdocs.ru/exchangeservice.svc"; var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService"); // авторизация по логину и паролю (тут возможно использовать также // авторизацию по сертификату при необходимости) var login = "******"; var password = "******"; if (client.Authenticate(login, password)) { Console.WriteLine("Успешная авторизация, получен токен:"); Console.WriteLine(client.Token); } else { Console.WriteLine("Ошибка авторизации"); Console.ReadKey(); return; } // получение текущего ящика var currentBoxInfo = client.GetBoxes().FirstOrDefault(); if (currentBoxInfo == null) { Console.WriteLine("Ошибка при получении ящиков"); return; } // выбор текущего ящика - от него будем отправлять документы // в простом случае - у пользователя доступен только один ящик // а если пользователь состоит в нескольких организациях - ящиков может быть несколько var currentBox = currentBoxInfo.Address; // ИНН организации-получателя var inn = "1839839970"; // пусть не знаем КПП, при пустом значении - должно автоматически быть получено головное // при получении списка организации var kpp = ""; // поиск организации получателя по атрибутам var organizations = client.GetOrganizationListByInnKpp(inn, kpp); // отладочный вывод некоторой информации о найденных организациях Console.WriteLine("Организации - получатели:"); foreach (var organization in organizations) Console.WriteLine(organization.Name); // создание списка получателей документов в сообщении var messageRecipients = organizations.Select(x => new MessageRecipient { // ящик получателя, при этом автоматически будет выбрано головное подразделение, // т.к. явно не указали подразделение OrganizationBoxId = x.BoxAddress }).ToList(); // добавление еще одного получателя: // выбор по определенному КПП подразделения организации - получателя var moreRecipientKpp = "243456789"; var moreRecipient = client.GetOrganizationByInnKpp("1839840035", null); // вывод некоторой инфомрации о найденном получателе: Console.WriteLine("Организация - дополнительный получатель:"); Console.WriteLine(moreRecipient.Name); // получим все подразделения организации и выберем нужное по КПП // в параметр метода передается текущий выбранный ящик var departments = client.GetOrganizationStructure(currentBox, moreRecipient.OrganizationId); var moreRecipientDepartment = departments.FirstOrDefault(x => x.Kpp == moreRecipientKpp); if (moreRecipientDepartment == null) { Console.WriteLine("Не удалось найти подразделение организации - дополительного получателя по КПП - " + moreRecipientKpp); return; } // ! т.к. Отправка документов без подписи нескольким контрагентам невозможна, // поэтому каждый из списков получателей содержим только одного получателя // Но например при отправке документов с подписью возможно отправлять документы сразу нескольких получателям // Пример указания определенного подразделения организации - получателя: // добавим полученную информацию о подразделении получателя в нужный список получателей var messageRecipientsWithDepartments = new List<MessageRecipient> { new MessageRecipient { // ящик организации - получателя OrganizationBoxId = moreRecipient.BoxAddress, // ИД подразделения организации - получателя (необязательный параметр) DepartmentId = moreRecipientDepartment.Id } }; // содержимое неформализованного документа из файла на локальном компьютере var filesDir = "../../../../.."; var filePath = filesDir + "/Documents/Untyped 3.txt"; var fileBytes = File.ReadAllBytes(filePath); // Пример создание документов: // созданный объект - документ можно использовать при отправке в сообщениях // только 1 раз, т.к. поля должны быть уникальными var document1 = new Document { Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = "Отправка без подписи - первый документ1 - " + Path.GetFileName(filePath), Content = fileBytes, Card = null, NeedSign = false }; // создание 2го документа var document2 = new Document { Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = "Отправка без подписи - второй документ2 - " + Path.GetFileName(filePath), Content = fileBytes, Card = null, NeedSign = false }; // создаем сообщение для отправки var unsignedMessage = new UnsignedMessage { From = currentBox, // документы в сообщение Documents = new[] { document1, document2 }, // получатели Recipients = messageRecipients.ToArray() }; // создаем сообщение для отправки по второму списку получателей - для примера c указанием подразделений // создание 3го документа var document3 = new Document { // для исключения дублирования ID документов - всегда необходимо создание уникальных идентификаторов документов Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = "Отправка без подписи - первый документ3 - " + Path.GetFileName(filePath), Content = fileBytes, Card = null, NeedSign = false }; // создание 4го документа var document4 = new Document { Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = "Отправка без подписи - второй документ4 - " + Path.GetFileName(filePath), Content = fileBytes, Card = null, NeedSign = false }; // создание 2го сообщения var unsignedMessage2 = new UnsignedMessage { From = currentBox, // документы в сообщение Documents = new[] { document3, document4 }, // получатели Recipients = messageRecipientsWithDepartments.ToArray() }; // пример отправки двух сообщений с разными наборами получателей // отправляем сообщение 1 SentMessage result1; try { result1 = client.SendUnsignedMessage(unsignedMessage); Console.WriteLine("Успешно отправлено исходящее сообщение с документами без подписи 1"); } catch (Exception ex) { Console.WriteLine("Ошибка при отправке сообщения 1" + ex.Message); Console.ReadKey(); return; } // отправляем сообщение 2 SentMessage result2; try { result2 = client.SendUnsignedMessage(unsignedMessage2); Console.WriteLine("Успешно отправлено исходящее сообщение с документами без подписи 2"); } catch (Exception ex) { Console.WriteLine("Ошибка при отправке сообщения 2" + ex.Message); Console.ReadKey(); return; } Console.WriteLine("Успешно отправлено исходящее сообщения"); Console.WriteLine("Для выхода нажмите enter"); Console.ReadLine(); }
/// <summary> /// Пример авторизации по сертификату /// получение данных по ИНН об организации-получателе /// отправка документа с подписью сертификатом пользователя /// отправка документ без подписания /// </summary> /// <param name="args"></param> private static void Main(string[] args) { var url = "https://service.synerdocs.ru/exchangeservice.svc"; var appId = new Guid().ToString(); var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService"); // сертификат для входа по сертификату и подписания var certificate = TryInstallOrGetCertificate(); if (certificate == null) return; Console.WriteLine("Успешно получен сертификат с отпечатком: " + certificate.Thumbprint); // авторизуемся по сертификату if (client.AuthenticateWithCertificate(certificate.Thumbprint, appId)) { Console.WriteLine("Успешная авторизация по сертификату, получен токен:"); Console.WriteLine(client.Token); } else { Console.WriteLine("Ошибка авторизации по сертификату"); } // ИНН организации-получателя var inn = "1839839904"; // не знаем КПП, при пустом значении - должно найти головное подразделение организации var kpp = ""; // поиск организации получателя по атрибутам var organizations = client.GetOrganizationListByInnKpp(inn, kpp); foreach (var organization in organizations) Console.WriteLine(organization.Name); // получаем содержимое неформализованного документа из файла на локальном компьютере var filesDir = "../../../../.."; // пример подписи файлов с локального компьютера var filePath = filesDir + "/Documents/Untyped 3.txt"; var filePath2 = filesDir + "/Documents/Untyped 1.png"; var fileBytes = File.ReadAllBytes(filePath); var fileBytes2 = File.ReadAllBytes(filePath2); // создание подписей к бинарному содержимому файлов, подписание с помощью выбранного ранее сертификата var signature = CryptoApiHelper.Sign(certificate, fileBytes, true); var signature2 = CryptoApiHelper.Sign(certificate, fileBytes2, true); // получение текущего ящика var boxInfo = client.GetBoxes().FirstOrDefault(); if (boxInfo == null) { Console.WriteLine("Ошибка при получении ящиков"); return; } var currentBox = boxInfo.Address; // создание документа var document = new Document { Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = Path.GetFileName(filePath), Content = fileBytes, Card = null, NeedSign = false }; // создание еще одного документа (опционально) var document2 = new Document { Id = Guid.NewGuid().ToString(), DocumentType = DocumentType.Untyped, UntypedKind = null, FileName = Path.GetFileName(filePath2), Content = fileBytes2, Card = null, NeedSign = false }; // создаем сообщение для отправки var message = new Message { // генерируем уникальный идентификатор для сообщения Id = Guid.NewGuid().ToString(), // указываем свой текущий ящик (ящик отправителя) From = currentBox, // документы Documents = new[] { document, document2 }, // получатели Recipients = organizations.Select(x => new MessageRecipient { OrganizationBoxId = x.BoxAddress }).ToArray(), // прикрепляем подписи Signs = new[] { new Sign { Id = Guid.NewGuid().ToString(), DocumentId = document.Id, Raw = signature }, new Sign { Id = Guid.NewGuid().ToString(), DocumentId = document2.Id, Raw = signature2 } } }; SentMessage result; try { result = client.SendMessage(message); } catch (Exception ex) { Console.WriteLine("Ошибка при отправке документов: " + ex.Message); Console.ReadKey(); return; } Console.WriteLine("Успешно отправлено исходящее сообщение MessageId = {0}", result.MessageId); Console.WriteLine("Для выхода нажмите enter"); Console.ReadLine(); }
/// <summary> /// Обработка запуска консольного приложения с параметрами командной строки /// </summary> /// <param name="args">аргументы \ параметры запуска из командной строки</param> public void Run(string[] args) { var url = args[0]; // Выбор нужной конечной точки в клиенте для возможности подключения по URL как по http, так и по https var configEndpointName = url.StartsWith("https") ? "WSHttpsBinding_IExchangeService" : "WSHttpBinding_IExchangeService"; // принять url var client = new Client(url, false, false, _applicationVersion, configEndpointName); try { _context = new ClientContext { ServiceClient = client }; // аутентификация Auth(client); // следующие команды ... var commandsMap = new Dictionary<string, Tuple<Action, string>> { {"get-boxes", Tuple.Create<Action,string>(Boxes, "Показать список ящиков")} , {"set-box", Tuple.Create<Action,string>(SetBox, "Выбрать ящик")} , {"load-messages", Tuple.Create<Action,string>(LoadMessages, "Загрузить и обработать входящие сообщения")}, {"send-docs", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentSigned), "Отправить документы")}, {"send-unsigned", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentUnsigned), "Отправить документы без подписи")}, {"send-forward", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentForward), "Переслать документы")}, {"send-internal", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentInternal), "Отправить документы подразделению")}, {"sign-document", Tuple.Create<Action,string>(SignDocument, "Подписать документ")}, {"reject-sign", Tuple.Create<Action,string>(RejectSign, "Отказать в подписании документа")}, {"move-docs", Tuple.Create<Action,string>(MoveDocuments, "Переместить документы в подразделение")}, {"get-doc-entries", Tuple.Create<Action,string>(GetDocumentEntries, "Список вхождений документов")}, {"get-doc-inner", Tuple.Create<Action,string>(GetInternalDocuments, "Список внутренних документов")}, {"get-doc-list", Tuple.Create<Action,string>(GetDocumentList, "Список документов")}, {"get-doc-info", Tuple.Create<Action,string>(GetDocumentInfo, "Загрузить документ")}, {"get-doc-flow", Tuple.Create<Action,string>(GetDocumentFlow, "Загрузить документ c вхождениями")}, {"get-draft-list", Tuple.Create<Action,string>(GetDraftMessageList, "Список черновиков")}, {"get-draft", Tuple.Create<Action,string>(GetDraftMessage, "Загрузить черновик")}, {"del-draft", Tuple.Create<Action,string>(DeleteDraftMessage, "Удалить черновик")}, {"get-contacts", Tuple.Create<Action,string>(GetActiveContacts, "Список активных контактов")}, {"del-contact", Tuple.Create<Action,string>(DeleteContact, "Удалить контакт")}, {"get-structure", Tuple.Create<Action,string>(GetOrganizationStructure, "Дерево орг.структуры")}, {"add-department", Tuple.Create<Action,string>(AddOrganizationStructureElement, "Добавить подразделение")}, {"edit-department", Tuple.Create<Action,string>(EditOrganizationStructureElement, "Изменить подразделение")}, {"del-department", Tuple.Create<Action,string>(DeleteOrganizationStructureElement, "Удалить подразделение")}, {"accept-reg", Tuple.Create<Action,string>(AcceptRegulation, "Принять Правила Synerdocs")}, {"add-doc-tag", Tuple.Create<Action,string>(AddDocumentTag, "Создать дополнительный статус(тэг) к документу")}, {"del-doc-tag", Tuple.Create<Action,string>(DeleteDocumentTag, "Удалить дополнительный статус(тэг), прикрепленный к документу")}, {"get-doc-tag", Tuple.Create<Action,string>(GetDocumentTag, "Показать информацию по дополнительному статусу(тэгу)")}, {"add-promocode", Tuple.Create<Action,string>(AddOrganizationPromoCode, "Добавить промокод в организацию")}, {"get-promocode-list", Tuple.Create<Action,string>(GetOrganizationPromoCodeList, "Список промокодов организации")}, {"get-promocode", Tuple.Create<Action,string>(GetPromoCodeByName, "Получить промокод")}, {"del-promocode", Tuple.Create<Action,string>(DeleteOrganizationPromoCode, "Удалить промокод")}, {"get-messages-without-content", Tuple.Create<Action,string>(GetMessagesWithoutDocumentsSignsContent, "Загрузить входящие сообщения без содержимого документов и подписей")}, {"send-revocation-offer", Tuple.Create<Action,string>(SendRevocationOffer, "Отправить ПОА")}, {"send-statement", Tuple.Create<Action,string>(SendStatementOfInvoiceReglament, "Отправить заявление об участии в ЭДО СФ")}, {"download-flow", Tuple.Create<Action,string>(DownloadDocumentFlowArchive, "Скачать документооборот в архиве")}, {"parse-document", Tuple.Create<Action,string>(TryParseDocumentContentFromFile, "Распарсить документ")}, {"download-pdf", Tuple.Create<Action,string>(DownloadPdfDocument, "Скачать документ в формате pdf")}, }; PrintAvailableCommnads(commandsMap); // выбираем первый доступный ящик var firstAvailableBox = client.GetBoxes().FirstOrDefault(); if (firstAvailableBox == null) { throw new InvalidOperationException("У пользователя нет доступа ни к одному ящику"); } _context.CurrentBox = firstAvailableBox.Address; _context.CurrentOrganizationId = firstAvailableBox.OrganizationId; _context.LoadLastProcessedMessageId(); _context.MessageFactory = new MessageFactory(_context.ServiceClient, _context.CurrentBox); if (string.IsNullOrWhiteSpace(_context.Login)) { var userInfo = client.GetUserInfo(_context.CurrentBox); _context.Login = userInfo.Login; } while (true) { UserInput.Write(ConsoleColor.White, ">"); var line = UserInput.ReadLine(); if (commandsMap.ContainsKey(line)) { try { commandsMap[line].Item1(); } catch (InputCanceledException) { Console.Out.WriteLine("Команда прервана"); } catch (Exception ex) { UserInput.Error("При выполнении команды произошла неожиданная ошибка"); UserInput.Error(ex.ToString()); } } else { UserInput.Error("Неправильно указано имя команды \"{0}\"", line); PrintAvailableCommnads(commandsMap); } } // интерактивная консоль для ввода // ввод значений списочных параметров по номерам // > auth // выберите сертификат // [email protected] [1] // [email protected] [2] // Сертификат [1]> // // Подтверждения // Отправить файлы? [Y/n]> } catch (InputCanceledException) { // Ctrl+C Console.Out.WriteLine(); Console.Out.WriteLine("Выход"); } catch (Exception ex) { UserInput.Error("Произошла неожиданная ошибка"); UserInput.Error(ex.ToString()); } }
/* Пример демонстрирует: * [+] авторизация по логину паролю * [+] авторизация по сертификату * [+] отправка подписанного НД * [+] подписание НД * [+] отказ от подписи под НД * [+] отправка ИОД для НД * [+] прием СД для НД (ИОП, УОУ, Подпись) * [+] отправка ЭСФ * [+] отправка СД для ЭСФ * [+] прием СД для ЭСФ * [+] работа с черновиками сообщений * [-] работа с контактами * [+] отправка нескольких документов * [+] обработка ошибок * [-] SSL * [+] загрузка большого документа (>1Мб) * [-] повторная отправка сообщения * [+-] загрузка, сохранение документа и документооборота на диск * [+] отображение подписи входящего документа */ public void Run(string[] args) { var url = args[0]; // Выбор нужной конечной точки в клиенте, т.к. конфиг не позволяет задать это одновременно простым способом // нужно, чтобы можно было заходить как по http, так и по https через консольный клиент // Bug 7733:В консольном клиенте не работает авторизация var configEndpointName = url.StartsWith("https") ? "WSHttpsBinding_IExchangeService" : "WSHttpBinding_IExchangeService"; // принять url var client = new Client(url, enableTracing: false, useStreamRequest: false, configEndpointName: configEndpointName); try { context = new ClientContext { ServiceClient = client, //MessageFactory = new MessageFactory(client) }; // аутентификация Auth(client); // следующие команды ... var commandsMap = new Dictionary<string, Tuple<Action, string>>() { {"get-boxes", Tuple.Create<Action,string>(Boxes, "Показать список ящиков")} , {"set-box", Tuple.Create<Action,string>(SetBox, "Выбрать ящик")} , {"load-messages", Tuple.Create<Action,string>(LoadMessages, "Загрузить и обработать входящие сообщения")}, {"send-docs", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentSigned), "Отправить документы")}, {"send-unsigned", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentUnsigned), "Отправить документы без подписи")}, {"send-forward", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentForward), "Переслать документы")}, {"send-internal", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentInternal), "Отправить документы подразделению")}, {"sign-document", Tuple.Create<Action,string>(SignDocument, "Подписать документ")}, {"reject-sign", Tuple.Create<Action,string>(RejectSign, "Отказать в подписании документа")}, {"move-docs", Tuple.Create<Action,string>(MoveDocuments, "Переместить документы в подразделение")}, {"get-doc-entries", Tuple.Create<Action,string>(GetDocumentEntries, "Список вхождений документов")}, {"get-doc-inner", Tuple.Create<Action,string>(GetInternalDocuments, "Список внутренних документов")}, {"get-doc-list", Tuple.Create<Action,string>(GetDocumentList, "Список документов")}, {"get-doc-info", Tuple.Create<Action,string>(GetDocumentInfo, "Загрузить документ")}, {"get-doc-flow", Tuple.Create<Action,string>(GetDocumentFlow, "Загрузить документ c вхождениями")}, {"get-draft-list", Tuple.Create<Action,string>(GetDraftMessageList, "Список черновиков")}, {"get-draft", Tuple.Create<Action,string>(GetDraftMessage, "Загрузить черновик")}, {"del-draft", Tuple.Create<Action,string>(DeleteDraftMessage, "Удалить черновик")}, {"get-contacts", Tuple.Create<Action,string>(GetActiveContacts, "Список активных контактов")}, {"del-contact", Tuple.Create<Action,string>(DeleteContact, "Удалить контакт")}, {"get-structure", Tuple.Create<Action,string>(GetOrganizationStructure, "Дерево орг.структуры")}, {"add-department", Tuple.Create<Action,string>(AddOrganizationStructureElement, "Добавить подразделение")}, {"edit-department", Tuple.Create<Action,string>(EditOrganizationStructureElement, "Изменить подразделение")}, {"del-department", Tuple.Create<Action,string>(DeleteOrganizationStructureElement, "Удалить подразделение")}, {"accept-reg", Tuple.Create<Action,string>(AcceptRegulation, "Принять Правила Synerdocs")}, // {"outmsg", OuntgoingMessages}, }; PrintAvailableCommnads(commandsMap); // // выбираем первый доступный ящик var firstAvailableBox = client.GetBoxes().FirstOrDefault(); if (firstAvailableBox == null) { throw new InvalidOperationException("У пользователя нет доступа ни к одному ящику"); } context.CurrentBox = firstAvailableBox.Address; context.CurrentOrganizationId = firstAvailableBox.OrganizationId; context.LoadLastProcessedMessageId(); context.MessageFactory = new MessageFactory(context.ServiceClient, context.CurrentBox); while (true) { UserInput.Write(ConsoleColor.White, ">"); var line = UserInput.ReadLine(); if (commandsMap.ContainsKey(line)) { try { commandsMap[line].Item1(); } catch (InputCanceledException) { Console.Out.WriteLine("Команда прервана"); continue; } catch (Exception ex) { UserInput.Error("При выполнении команды произошла неожиданная ошибка"); UserInput.Error(ex.ToString()); } } else { UserInput.Error("Неправильно указано имя команды \"{0}\"", line); PrintAvailableCommnads(commandsMap); } } // интерактивная консоль для ввода // ввод значений списочных параметров по номерам // > auth // выберите сертификат // [email protected] [1] // [email protected] [2] // Сертификат [1]> // // Подтверждения // Отправить файлы? [Y/n]> } catch (InputCanceledException) { // Ctrl+C Console.Out.WriteLine(); Console.Out.WriteLine("Выход"); } catch (Exception ex) { UserInput.Error("Произошла неожиданная ошибка"); UserInput.Error(ex.ToString()); } }