Skip to content

Commit

Permalink
Search for old bridge on startup if IP address changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Loginer von Web committed Sep 30, 2015
1 parent ed442b2 commit 011d136
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 1 deletion.
3 changes: 3 additions & 0 deletions Albedo/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@
<setting name="ambientColorOnly" serializeAs="String">
<value>0</value>
</setting>
<setting name="bridgeIdentity" serializeAs="String">
<value />
</setting>
</Albedo.Properties.Settings>
</userSettings>
</configuration>
49 changes: 49 additions & 0 deletions Albedo/Core/JsonParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,25 @@ public static dynamic Deserialize(string stringData)
dynamic dynamicData = new ExpandoObject();
var dataRef = (IDictionary<string, object>)dynamicData;
subString = Regex.Replace(subString, "^(\\s)+", ""); //Remove leading whitespace

//Check if it's an array
if (subString.StartsWith("[")) {
subString = Regex.Replace(subString, "(\\s)+$", ""); //Remove trailing whitespace
subString = ReplaceComma(subString);
subString = subString.Substring(1, subString.Length - 2); //Remove brackets

List<dynamic> dynamicList = new List<dynamic>();

string[] subStringArray = subString.Split('α');

foreach (string subSubString in subStringArray) {
dynamicList.Add(Deserialize(subSubString));
}

dynamic[] dynamicArray = dynamicList.ToArray();
return dynamicArray;
}

subString = subString.Remove(0, 1); //Remove first curly brace
subString = Regex.Replace(subString, "(\\s)+$", ""); //Remove trailing whitespace
if (subString.Substring(subString.Length - 1, 1) == "}") {
Expand Down Expand Up @@ -192,6 +211,36 @@ public static dynamic DeserializeValue(string subString)
return elementObject;
}

public static int IndexOfComma(string line)
{
StringBuilder lineBuild = new StringBuilder(line);
int parDepth = 0;

for (int i = 0; i < lineBuild.Length; i++) {
if (lineBuild[i] == '}') { parDepth--; }
if (parDepth > 0) { lineBuild[i] = 'Ä'; }
if (lineBuild[i] == '{') { parDepth++; }
}

string lineClean = lineBuild.ToString();

return lineClean.IndexOf(',');
}

public static string ReplaceComma(string line)
{
string lineClean = line;

while (IndexOfComma(lineClean) >= 0) {
int index = IndexOfComma(lineClean);
StringBuilder build = new StringBuilder(lineClean);
build[index] = 'α';
lineClean = build.ToString();
}

return lineClean;
}

public static void JsonTest()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
Expand Down
62 changes: 62 additions & 0 deletions Albedo/Core/Storage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ async public static Task RefreshData(bool doSceneBackup = false, int retry = 0)
latestData = backupData;
groupData = groupBackupData;
finalize = true;

return;
}
} finally {
Expand Down Expand Up @@ -101,7 +102,10 @@ public static int InitializeData()

var result = RefreshData();

var bridgeResult = FindNewBridgeIP();

Effects.AutoEffect();
var bridgeResult2 = StoreBridgeID();

return 0;
}
Expand All @@ -113,6 +117,64 @@ public static int ReinitializeData() //Should be called when changing groups.
return 0;
}

//Attempt to store bridge ID
async public static Task StoreBridgeID()
{
if (Platform.ReadSetting("bridgeIdentity") == "") {
try {
HttpClient client = new HttpClient();
Task<HttpResponseMessage> getBridgeData = client.GetAsync("https://www.meethue.com/api/nupnp");
HttpResponseMessage bridgeData = await getBridgeData;
string bridgeString = await bridgeData.Content.ReadAsStringAsync();
dynamic bridgeJson = JsonParser.Deserialize(bridgeString);
foreach (dynamic bridgeInfo in bridgeJson) {
string bridgeIdentity = bridgeInfo.id;
string bridgeAddress = bridgeInfo.internalipaddress;
bridgeIdentity = bridgeIdentity.ToLowerInvariant();
if (bridgeAddress == Platform.ReadSetting("bridgeIP")) {
Platform.WriteSetting("bridgeIdentity", bridgeIdentity);
Platform.SaveSettings();
}
return;
}
} catch { }
}
}

//Find the bridge again if the local IP changes
async public static Task FindNewBridgeIP()
{
bool syncFailed = false;
try {
HttpClient client = new HttpClient();
Task<HttpResponseMessage> getTestData = client.GetAsync(AddressBuild.LightsRoot());
HttpResponseMessage testData = await getTestData;
string testString = await testData.Content.ReadAsStringAsync();
dynamic testJson = JsonParser.Deserialize(testString);
} catch { syncFailed = true; }

if (!syncFailed) { return; }

try {
HttpClient client = new HttpClient();
Task<HttpResponseMessage> getBridgeData = client.GetAsync("https://www.meethue.com/api/nupnp");
HttpResponseMessage bridgeData = await getBridgeData;
string bridgeString = await bridgeData.Content.ReadAsStringAsync();
dynamic bridgeJson = JsonParser.Deserialize(bridgeString);
foreach (dynamic bridgeInfo in bridgeJson) {
string bridgeIdentity = bridgeInfo.id;
string bridgeAddress = bridgeInfo.internalipaddress;
bridgeIdentity = bridgeIdentity.ToLowerInvariant();
if (bridgeIdentity == Platform.ReadSetting("bridgeIdentity")) {
if (bridgeAddress != Platform.ReadSetting("bridgeIP")) {
Platform.WriteSetting("bridgeIP", bridgeAddress);
Platform.SaveSettings();
}
}
}
} catch { }
}

public static void IntializeDefaultScenes()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
Expand Down
1 change: 1 addition & 0 deletions Albedo/EditorWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,7 @@ private void ResetButton_Click(object sender, RoutedEventArgs e)

if (writeMessage == MessageBoxResult.Yes) {
Properties.Settings.Default.bridgeIP = "0.0.0.0";
Properties.Settings.Default.bridgeIdentity = "";
Properties.Settings.Default.Save();
WindowStorage.dummyStorage.Exit();
}
Expand Down
14 changes: 13 additions & 1 deletion Albedo/Properties/Settings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Albedo/Properties/Settings.settings
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,8 @@
<Setting Name="ambientColorOnly" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="bridgeIdentity" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

0 comments on commit 011d136

Please sign in to comment.