private static void GetContactsFromResponse(WebResponse response, StatusDownload loghandler) { var httpResponse = response.GetResponseStream(); using (var streamReader = new StreamReader(httpResponse)) { var result = streamReader.ReadToEnd(); var receivedData = JsonConvert.DeserializeObject <CustomerSyncResult>(result); if (receivedData.success) { var contacts = receivedData.contacts; DBLocalDataStore.GetInstance().ClearAllContacts(); foreach (var contact in contacts) { if (string.IsNullOrEmpty(contact.uid)) { Console.WriteLine("Received contact {0} has no UID, ignoring", JsonConvert.SerializeObject(contact, Formatting.Indented)); continue; } var localContact = new DBlocalContact(contact); localContact.source = ContactSource.Server; DBLocalDataStore.GetInstance().AddLocalContact(localContact); Console.Error.WriteLine("Contact with UID {0} added", contact.uid); } loghandler(true, "Contacts updated from server"); } else { loghandler(false, receivedData.error); } } }
public static bool validateContact(DBlocalContact contact, bool isNewContact) { if (contact == null) { throw new ArgumentNullException(nameof(contact), "Contact must not be null"); } if (string.IsNullOrEmpty(contact.firstname)) { throw new ArgumentException("First name is missing"); } if (string.IsNullOrEmpty(contact.lastname)) { throw new ArgumentException("Last name is missing"); } if (string.IsNullOrEmpty(contact.email) && isNewContact) { throw new ArgumentException("Email is missing"); } if (!OfflineLogic.isEmail(contact.email) && isNewContact) { throw new ArgumentException("Email is incorrect"); } return(true); }
private static void UpdateContactsFromResponse(List <CustomerType> contactsList) { var localContacts = DBLocalDataStore.GetInstance().GetLocalContacts(); localContacts.RemoveAll((c) => string.IsNullOrWhiteSpace(c.uid)); var serverContacts = contactsList; if (serverContacts != null) { foreach (var contact in serverContacts) { if (string.IsNullOrWhiteSpace(contact.uid)) { Console.WriteLine("Received contact {0} has no UID, ignoring", JsonConvert.SerializeObject(contact, Formatting.Indented)); continue; } var existingLocalContact = localContacts.Find(c => c.uid.Equals(contact.uid)); var newContact = new DBlocalContact(contact); if (existingLocalContact != null) { existingLocalContact += newContact; existingLocalContact.source = ContactSource.Server; DBLocalDataStore.GetInstance().UpdateLocalContact(existingLocalContact); Console.Error.WriteLine("Contact with UID {0} updated from server", contact.uid); } else { newContact.source = ContactSource.Server; DBLocalDataStore.GetInstance().AddLocalContact(newContact); Console.Error.WriteLine("Contact with UID {0} added", contact.uid); } } } }
private static DBlocalContact parseAsArtexis(string barcodeString) { //format example: "[["barcode","5160017139930041470033",0],["Name","Gert Stalmans",1]]" var parts = barcodeString.Trim('[', ']').Split(new string[] { "],[" }, StringSplitOptions.RemoveEmptyEntries); string barcode = string.Empty; string firstName = string.Empty; string lastName = string.Empty; foreach (var part in parts) { string partCopy = new string(part.ToCharArray()); partCopy = partCopy.Replace("\"", null); var subParts = partCopy.Split(','); if (subParts[0].ToLower().Equals("barcode")) { barcode = subParts[1]; continue; } if (subParts[0].ToLower().Equals("name")) { string namePart = subParts[1]; if (namePart.Contains(" ")) { var nameSplit = namePart.Split(' ').ToList(); firstName = nameSplit.ElementAt(0); nameSplit.RemoveAt(0); lastName = string.Join(" ", nameSplit); } else { firstName = namePart; } continue; } } if (string.IsNullOrWhiteSpace(barcode) || string.IsNullOrWhiteSpace(string.Format("{0} {1}", firstName, lastName))) { throw new InvalidOperationException("The QR code contains invalid information and can't be used."); } else { DBlocalContact contact = new DBlocalContact(); contact.firstname = firstName; contact.lastname = string.IsNullOrWhiteSpace(lastName) ? null : lastName; contact.uid = barcode; return(contact); } }
public static void createOrUpdateContact(DBlocalContact newContact) { DBlocalContact oldLocalContact = DBLocalDataStore.GetInstance().GetLocalContactsByUID(newContact.uid); DBContactToServer existingChanges = DBLocalDataStore.GetInstance().GetContactsToServerByUID(newContact.uid); if (oldLocalContact != null) { if (existingChanges == null) { existingChanges = new DBContactToServer(oldLocalContact); existingChanges -= newContact; DBLocalDataStore.GetInstance().AddContactToServer(existingChanges); } else { DBContactToServer lastChanges = new DBContactToServer(oldLocalContact); lastChanges -= newContact; existingChanges &= lastChanges; DBLocalDataStore.GetInstance().UpdateContactToServer(existingChanges); } newContact.Id = oldLocalContact.Id; newContact.activeContact = true; DBLocalDataStore.GetInstance().UpdateLocalContact(newContact); Console.WriteLine("updated contact: \n{0}", JsonConvert.SerializeObject(newContact)); } else { existingChanges = new DBContactToServer(newContact, true); //existingChanges = existingChanges.newContact(existingChanges); DBLocalDataStore.GetInstance().AddContactToServer(existingChanges); newContact.activeContact = true; if (newContact.Id == 0) { DBLocalDataStore.GetInstance().AddLocalContact(newContact); } else { DBLocalDataStore.GetInstance().UpdateLocalContact(newContact); } Console.WriteLine("created contact: \n{0}", JsonConvert.SerializeObject(newContact)); } }
public static async Task sendBadge(DBlocalContact contact, string URL) { try { var uri = new Uri(URL); uri.ToString(); } catch { throw new ArgumentException("Invalid webhook URL"); } SyncContext scr = new SyncContext(); scr.context = new RequestData(); scr.contacts = new List <CustomerType>(); scr.contacts.Add(new CustomerType(contact)); var appInfo = DBLocalDataStore.GetInstance().GetAppInfo(); var user = DBLocalDataStore.GetInstance().GetLocalUserInfo(); var context = scr.context; context.password = user.password; context.username = user.username; context.profile = DBLocalDataStore.GetInstance().GetSelectProfile().shortName; context.tags = new string[] { user.tags }; context.campaignReference = appInfo.campaignReference; string json = JsonConvert.SerializeObject(scr, Formatting.Indented); Console.WriteLine("Trying to send to webhook:\n{0}", json); //var httpWebRequest = (HttpWebRequest)WebRequest.Create(URL); var httpWebRequest = WebRequest.CreateHttp(URL); try { //throw new Exception("TEST EXCEPTION"); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; httpWebRequest.Timeout = 30000; httpWebRequest.ServicePoint.ConnectionLimit = 3; httpWebRequest.KeepAlive = false; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { streamWriter.Write(json); } var response = await httpWebRequest.GetResponseAsync(); using (var streamReader = new StreamReader(response.GetResponseStream())) { var result = streamReader.ReadToEnd(); Console.WriteLine("Received from webhook:\n{0}", result); var settings = new JsonSerializerSettings(); settings.MissingMemberHandling = MissingMemberHandling.Ignore; var receivedData = JsonConvert.DeserializeObject <CustomerSyncResult>(result, settings); if (NetworkRequests._onFinishPrint != null) { NetworkRequests._onFinishPrint(receivedData.success); } } } catch (Exception ex) { Console.WriteLine("Webhook exception: {0}", ex.Message); if (NetworkRequests._onFinishPrint != null) { NetworkRequests._onFinishPrint(false); } //throw; } finally { httpWebRequest.Abort(); } }
public static async Task <DBlocalContact> didScanBarcode(string barcode_, string symbology, StatusLookup callback) { if (callback == null) { throw new ArgumentNullException("Callback must not be null to handle result"); } var barcode = barcode_.Trim(); DBlocalContact temporaryContact = null; if (symbology == "QR") { if (!OfflineLogic.isBarcodeValid(barcode)) { throw new InvalidOperationException("The QR code cannot be used by BoaBee because it is not a contact or an ID."); } else if (barcode.Contains("BEGIN:VCARD")) { //VCard temporaryContact = OfflineLogic.parseAsVCard(barcode); } else if (barcode.StartsWith("[[") && barcode.EndsWith("]]")) { //Artexis temporaryContact = OfflineLogic.parseAsArtexis(barcode); } else { //unknown format temporaryContact = new DBlocalContact(); temporaryContact.uid = barcode; } } else { //unknown format temporaryContact = new DBlocalContact(); temporaryContact.uid = barcode; } DBAppSettings appSettings = DBLocalDataStore.GetInstance().GetAppSettings(); if (appSettings == null) { appSettings = new DBAppSettings(); appSettings.instantContactCheck = true; DBLocalDataStore.GetInstance().SetAppSettings(appSettings); } string message = string.Empty; if (appSettings.instantContactCheck) { var localContact = DBLocalDataStore.GetInstance().GetLocalContactsByUID(temporaryContact.uid); if (localContact != null) { temporaryContact &= localContact; temporaryContact.Id = localContact.Id; } if (await Reachability.isConnected()) { try { int timeout = 10000; var timeoutCancellationTokenSource = new CancellationTokenSource(); var timeoutTask = Task.Delay(timeout, timeoutCancellationTokenSource.Token); var task = NetworkRequests.contactLookup(temporaryContact.uid); DBlocalContact serverContact = null; if (await Task.WhenAny(task, timeoutTask) == task) { // Task completed within timeout. // Consider that the task may have faulted or been canceled. // We re-await the task so that any exceptions/cancellation is rethrown. timeoutCancellationTokenSource.Cancel(); serverContact = await task; if (serverContact != null) { if (serverContact.hasOnlyUID() || serverContact.hasOnlyUIDAndName()) { message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available."; } else { message = "These are the details we have found for you. Feel free to complete the rest below."; } } else { message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available."; } Console.Error.WriteLine("Server has contact: {0}", serverContact != null); } else { // timeout/cancellation logic message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available."; Console.Error.WriteLine("Timed out"); } temporaryContact *= serverContact; } catch (Exception e) { message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available."; Console.Error.WriteLine("contactLookup exception: {0}", e.Message); } } else { message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available."; } } else { message = "Instant contact checking is turned off"; } callback(message); return(temporaryContact); }
private static DBlocalContact parseAsVCard(string barcode) { var QRContent = barcode.Split("\r\n".ToCharArray()); DBlocalContact contact = new DBlocalContact(); foreach (var _part in QRContent) { var part = string.Copy(_part); part = part.Replace("\r\n", "").Replace("\r", "").Replace("\n", ""); if (part.Contains("N:") && part.IndexOf("N:") == 0) { var t = part.Substring(part.IndexOf(":") + 1).Split(";".ToCharArray()); List <string> firstLastName = new List <string>(); foreach (var st in t) { if (!st.Contains(";") && !string.IsNullOrEmpty(st)) { firstLastName.Add(st); } } contact.lastname = firstLastName[0].Trim(); contact.firstname = firstLastName[1].Trim(); continue; } if (part.Contains("ORG") && part.IndexOf("ORG") == 0) { contact.company = part.Substring(part.IndexOf(":") + 1); continue; } if (part.Contains("EMAIL") && part.IndexOf("EMAIL") == 0) { if (string.IsNullOrEmpty(contact.email)) { contact.email = part.Substring(part.IndexOf(":") + 1); contact.uid = contact.email; } continue; } if (part.Contains("TEL") && part.IndexOf("TEL") == 0) { if (string.IsNullOrEmpty(contact.phone)) { contact.phone = part.Substring(part.IndexOf(":") + 1); } continue; } if (part.Contains("ADR") && part.IndexOf("ADR") == 0) { part = part.Substring(part.IndexOf(":") + 1); List <string> adr_parts = part.Split(";".ToCharArray(), StringSplitOptions.None).ToList(); contact.city = adr_parts[3]; contact.street = adr_parts[2]; contact.zip = adr_parts[5]; contact.country = adr_parts[6]; continue; } } //contact.email = contact.email.Replace(" ", string.Empty); if (contact.email != null) { contact.email = contact.email.Trim(); } if (contact.lastname != null) { contact.lastname = contact.lastname.Trim(); } if (contact.firstname != null) { contact.firstname = contact.firstname.Trim(); } if (!isEmail(contact.email)) { throw new InvalidOperationException("The QR code contains invalid information and can't be used."); } if (string.IsNullOrWhiteSpace(contact.lastname)) { throw new InvalidOperationException("The QR code contains invalid information and can't be used."); } if (string.IsNullOrWhiteSpace(contact.firstname)) { throw new InvalidOperationException("The QR code contains invalid information and can't be used."); } return(contact); }