Merge pull request #3859 from ScottNZ/irc
Add IRC client to the serverbrowser
This commit is contained in:
14
Makefile
14
Makefile
@@ -63,7 +63,7 @@ INSTALL_PROGRAM = $(INSTALL) -m755
|
|||||||
INSTALL_DATA = $(INSTALL) -m644
|
INSTALL_DATA = $(INSTALL) -m644
|
||||||
|
|
||||||
# program targets
|
# program targets
|
||||||
CORE = fileformats rcg rgl rsdl rnull game utility geoip
|
CORE = fileformats rcg rgl rsdl rnull game utility geoip irc
|
||||||
TOOLS = editor tsbuild ralint
|
TOOLS = editor tsbuild ralint
|
||||||
|
|
||||||
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
||||||
@@ -97,6 +97,14 @@ game_FLAGS = -win32icon:OpenRA.Game/OpenRA.ico
|
|||||||
PROGRAMS += game
|
PROGRAMS += game
|
||||||
game: $(game_TARGET)
|
game: $(game_TARGET)
|
||||||
|
|
||||||
|
irc_SRCS := $(shell find OpenRA.Irc/ -iname '*.cs')
|
||||||
|
irc_TARGET = OpenRA.Irc.dll
|
||||||
|
irc_KIND = library
|
||||||
|
irc_DEPS = $(fileformats_TARGET) $(game_TARGET)
|
||||||
|
irc_LIBS = $(COMMON_LIBS) $(irc_DEPS)
|
||||||
|
PROGRAMS += irc
|
||||||
|
irc: $(irc_TARGET)
|
||||||
|
|
||||||
# Renderer dlls
|
# Renderer dlls
|
||||||
rsdl_SRCS := $(shell find OpenRA.Renderer.SdlCommon/ -iname '*.cs')
|
rsdl_SRCS := $(shell find OpenRA.Renderer.SdlCommon/ -iname '*.cs')
|
||||||
rsdl_TARGET = OpenRA.Renderer.SdlCommon.dll
|
rsdl_TARGET = OpenRA.Renderer.SdlCommon.dll
|
||||||
@@ -141,8 +149,8 @@ STD_MOD_DEPS = $(STD_MOD_LIBS) $(ralint_TARGET)
|
|||||||
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
|
mod_ra_SRCS := $(shell find OpenRA.Mods.RA/ -iname '*.cs')
|
||||||
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
|
mod_ra_TARGET = mods/ra/OpenRA.Mods.RA.dll
|
||||||
mod_ra_KIND = library
|
mod_ra_KIND = library
|
||||||
mod_ra_DEPS = $(STD_MOD_DEPS) $(utility_TARGET) $(geoip_TARGET)
|
mod_ra_DEPS = $(STD_MOD_DEPS) $(utility_TARGET) $(geoip_TARGET) $(irc_TARGET)
|
||||||
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(utility_TARGET) $(geoip_TARGET)
|
mod_ra_LIBS = $(COMMON_LIBS) $(STD_MOD_LIBS) $(utility_TARGET) $(geoip_TARGET) $(irc_TARGET)
|
||||||
PROGRAMS += mod_ra
|
PROGRAMS += mod_ra
|
||||||
mod_ra: $(mod_ra_TARGET)
|
mod_ra: $(mod_ra_TARGET)
|
||||||
|
|
||||||
|
|||||||
@@ -120,7 +120,10 @@
|
|||||||
<Compile Include="Primitives\Cache.cs" />
|
<Compile Include="Primitives\Cache.cs" />
|
||||||
<Compile Include="Primitives\Cached.cs" />
|
<Compile Include="Primitives\Cached.cs" />
|
||||||
<Compile Include="Primitives\DisposableAction.cs" />
|
<Compile Include="Primitives\DisposableAction.cs" />
|
||||||
|
<Compile Include="Primitives\IObservableCollection.cs" />
|
||||||
<Compile Include="Primitives\Lazy.cs" />
|
<Compile Include="Primitives\Lazy.cs" />
|
||||||
|
<Compile Include="Primitives\ObservableCollection.cs" />
|
||||||
|
<Compile Include="Primitives\ObservableDictionary.cs" />
|
||||||
<Compile Include="Primitives\Pair.cs" />
|
<Compile Include="Primitives\Pair.cs" />
|
||||||
<Compile Include="Primitives\PriorityQueue.cs" />
|
<Compile Include="Primitives\PriorityQueue.cs" />
|
||||||
<Compile Include="Primitives\Set.cs" />
|
<Compile Include="Primitives\Set.cs" />
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace OpenRA.FileFormats
|
|||||||
while (!actions.Empty && actions.Peek().Time <= t)
|
while (!actions.Empty && actions.Peek().Time <= t)
|
||||||
{
|
{
|
||||||
var da = actions.Pop();
|
var da = actions.Pop();
|
||||||
a += da.Action;
|
a = da.Action + a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
a();
|
a();
|
||||||
|
|||||||
25
OpenRA.FileFormats/Primitives/IObservableCollection.cs
Normal file
25
OpenRA.FileFormats/Primitives/IObservableCollection.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
namespace OpenRA.FileFormats.Primitives
|
||||||
|
{
|
||||||
|
public interface IObservableCollection
|
||||||
|
{
|
||||||
|
event Action<object> OnAdd;
|
||||||
|
event Action<object> OnRemove;
|
||||||
|
event Action<int> OnRemoveAt;
|
||||||
|
event Action<object, object> OnSet;
|
||||||
|
event Action OnRefresh;
|
||||||
|
IEnumerable ObservedItems { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
59
OpenRA.FileFormats/Primitives/ObservableCollection.cs
Normal file
59
OpenRA.FileFormats/Primitives/ObservableCollection.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
|
||||||
|
namespace OpenRA.FileFormats.Primitives
|
||||||
|
{
|
||||||
|
public class ObservableCollection<T> : Collection<T>, IObservableCollection
|
||||||
|
{
|
||||||
|
public event Action<object> OnAdd = k => { };
|
||||||
|
public event Action<object> OnRemove = k => { };
|
||||||
|
public event Action<int> OnRemoveAt = i => { };
|
||||||
|
public event Action<object, object> OnSet = (o, n) => { };
|
||||||
|
public event Action OnRefresh = () => { };
|
||||||
|
|
||||||
|
public ObservableCollection() : base() { }
|
||||||
|
public ObservableCollection(IList<T> list) : base(list) { }
|
||||||
|
|
||||||
|
protected override void SetItem(int index, T item)
|
||||||
|
{
|
||||||
|
var old = this[index];
|
||||||
|
base.SetItem(index, item);
|
||||||
|
OnSet(old, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void InsertItem(int index, T item)
|
||||||
|
{
|
||||||
|
base.InsertItem(index, item);
|
||||||
|
OnAdd(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ClearItems()
|
||||||
|
{
|
||||||
|
base.ClearItems();
|
||||||
|
OnRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void RemoveItem(int index)
|
||||||
|
{
|
||||||
|
base.RemoveItem(index);
|
||||||
|
OnRemoveAt(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable ObservedItems
|
||||||
|
{
|
||||||
|
get { return base.Items; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
137
OpenRA.FileFormats/Primitives/ObservableDictionary.cs
Normal file
137
OpenRA.FileFormats/Primitives/ObservableDictionary.cs
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace OpenRA.FileFormats.Primitives
|
||||||
|
{
|
||||||
|
public class ObservableSortedDictionary<TKey, TValue> : ObservableDictionary<TKey, TValue>
|
||||||
|
{
|
||||||
|
public ObservableSortedDictionary(IComparer<TKey> comparer)
|
||||||
|
{
|
||||||
|
InnerDict = new SortedDictionary<TKey, TValue>(comparer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Add(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
InnerDict.Add(key, value);
|
||||||
|
FireOnRefresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IObservableCollection
|
||||||
|
{
|
||||||
|
protected IDictionary<TKey, TValue> InnerDict;
|
||||||
|
|
||||||
|
public event Action<object> OnAdd = k => { };
|
||||||
|
public event Action<object> OnRemove = k => { };
|
||||||
|
public event Action<int> OnRemoveAt = i => { };
|
||||||
|
public event Action<object, object> OnSet = (o, n) => { };
|
||||||
|
public event Action OnRefresh = () => { };
|
||||||
|
|
||||||
|
protected void FireOnRefresh()
|
||||||
|
{
|
||||||
|
OnRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ObservableDictionary() { }
|
||||||
|
|
||||||
|
public ObservableDictionary(IEqualityComparer<TKey> comparer)
|
||||||
|
{
|
||||||
|
InnerDict = new Dictionary<TKey, TValue>(comparer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Add(TKey key, TValue value)
|
||||||
|
{
|
||||||
|
InnerDict.Add(key, value);
|
||||||
|
OnAdd(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(TKey key)
|
||||||
|
{
|
||||||
|
var found = InnerDict.Remove(key);
|
||||||
|
if (found)
|
||||||
|
OnRemove(key);
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsKey(TKey key)
|
||||||
|
{
|
||||||
|
return InnerDict.ContainsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICollection<TKey> Keys { get { return InnerDict.Keys; } }
|
||||||
|
public ICollection<TValue> Values { get { return InnerDict.Values; } }
|
||||||
|
|
||||||
|
public bool TryGetValue(TKey key, out TValue value)
|
||||||
|
{
|
||||||
|
return InnerDict.TryGetValue(key, out value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TValue this[TKey key]
|
||||||
|
{
|
||||||
|
get { return InnerDict[key]; }
|
||||||
|
set { InnerDict[key] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
InnerDict.Clear();
|
||||||
|
OnRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get { return InnerDict.Count; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
Add(item.Key, item.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
return InnerDict.Contains(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
InnerDict.CopyTo(array, arrayIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsReadOnly
|
||||||
|
{
|
||||||
|
get { return InnerDict.IsReadOnly; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(KeyValuePair<TKey, TValue> item)
|
||||||
|
{
|
||||||
|
return Remove(item.Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
|
||||||
|
{
|
||||||
|
return InnerDict.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return InnerDict.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable ObservedItems
|
||||||
|
{
|
||||||
|
get { return InnerDict.Keys; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -162,6 +162,21 @@ namespace OpenRA.GameRules
|
|||||||
public string CycleTabsKey = "tab";
|
public string CycleTabsKey = "tab";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class IrcSettings
|
||||||
|
{
|
||||||
|
public string Hostname = "irc.open-ra.org";
|
||||||
|
public int Port = 6667;
|
||||||
|
public string Nickname = null;
|
||||||
|
public string Username = "openra";
|
||||||
|
public string Realname = null;
|
||||||
|
public string DefaultNickname = "Newbie";
|
||||||
|
public string Channel = "global";
|
||||||
|
public string TimestampFormat = "HH:mm:ss";
|
||||||
|
public int ReconnectDelay = 10000;
|
||||||
|
public int ConnectionTimeout = 300000;
|
||||||
|
public bool Debug = false;
|
||||||
|
public bool ConnectAutomatically = false;
|
||||||
|
}
|
||||||
|
|
||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
@@ -174,6 +189,7 @@ namespace OpenRA.GameRules
|
|||||||
public ServerSettings Server = new ServerSettings();
|
public ServerSettings Server = new ServerSettings();
|
||||||
public DebugSettings Debug = new DebugSettings();
|
public DebugSettings Debug = new DebugSettings();
|
||||||
public KeySettings Keys = new KeySettings();
|
public KeySettings Keys = new KeySettings();
|
||||||
|
public IrcSettings Irc = new IrcSettings();
|
||||||
|
|
||||||
public Dictionary<string, object> Sections;
|
public Dictionary<string, object> Sections;
|
||||||
|
|
||||||
@@ -189,6 +205,7 @@ namespace OpenRA.GameRules
|
|||||||
{"Server", Server},
|
{"Server", Server},
|
||||||
{"Debug", Debug},
|
{"Debug", Debug},
|
||||||
{"Keys", Keys},
|
{"Keys", Keys},
|
||||||
|
{"Irc", Irc}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Override fieldloader to ignore invalid entries
|
// Override fieldloader to ignore invalid entries
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using OpenRA.FileFormats.Primitives;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
|
|
||||||
namespace OpenRA.Widgets
|
namespace OpenRA.Widgets
|
||||||
@@ -61,7 +62,6 @@ namespace OpenRA.Widgets
|
|||||||
|
|
||||||
public void ReplaceChild(Widget oldChild, Widget newChild)
|
public void ReplaceChild(Widget oldChild, Widget newChild)
|
||||||
{
|
{
|
||||||
|
|
||||||
oldChild.Removed();
|
oldChild.Removed();
|
||||||
newChild.Parent = this;
|
newChild.Parent = this;
|
||||||
Children[Children.IndexOf(oldChild)] = newChild;
|
Children[Children.IndexOf(oldChild)] = newChild;
|
||||||
@@ -69,8 +69,6 @@ namespace OpenRA.Widgets
|
|||||||
Scroll(0);
|
Scroll(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override void DrawOuter()
|
public override void DrawOuter()
|
||||||
{
|
{
|
||||||
if (!IsVisible())
|
if (!IsVisible())
|
||||||
@@ -85,7 +83,7 @@ namespace OpenRA.Widgets
|
|||||||
if (thumbHeight == ScrollbarHeight)
|
if (thumbHeight == ScrollbarHeight)
|
||||||
thumbHeight = 0;
|
thumbHeight = 0;
|
||||||
|
|
||||||
backgroundRect = new Rectangle(rb.X, rb.Y, rb.Width - ScrollbarWidth+1, rb.Height);
|
backgroundRect = new Rectangle(rb.X, rb.Y, rb.Width - ScrollbarWidth + 1, rb.Height);
|
||||||
upButtonRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Y, ScrollbarWidth, ScrollbarWidth);
|
upButtonRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Y, ScrollbarWidth, ScrollbarWidth);
|
||||||
downButtonRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Bottom - ScrollbarWidth, ScrollbarWidth, ScrollbarWidth);
|
downButtonRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Bottom - ScrollbarWidth, ScrollbarWidth, ScrollbarWidth);
|
||||||
scrollbarRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Y + ScrollbarWidth - 1, ScrollbarWidth, ScrollbarHeight + 2);
|
scrollbarRect = new Rectangle(rb.Right - ScrollbarWidth, rb.Y + ScrollbarWidth - 1, ScrollbarWidth, ScrollbarHeight + 2);
|
||||||
@@ -145,6 +143,11 @@ namespace OpenRA.Widgets
|
|||||||
ListOffset = 0;
|
ListOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ScrolledToBottom
|
||||||
|
{
|
||||||
|
get { return ListOffset == Math.Min(0, Bounds.Height - ContentHeight); }
|
||||||
|
}
|
||||||
|
|
||||||
public void ScrollToItem(string itemKey)
|
public void ScrollToItem(string itemKey)
|
||||||
{
|
{
|
||||||
var item = Children.FirstOrDefault(c =>
|
var item = Children.FirstOrDefault(c =>
|
||||||
@@ -226,5 +229,116 @@ namespace OpenRA.Widgets
|
|||||||
|
|
||||||
return UpPressed || DownPressed || ThumbPressed;
|
return UpPressed || DownPressed || ThumbPressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IObservableCollection collection;
|
||||||
|
Func<object, Widget> makeWidget;
|
||||||
|
Func<Widget, object, bool> widgetItemEquals;
|
||||||
|
bool autoScroll;
|
||||||
|
|
||||||
|
public void Unbind()
|
||||||
|
{
|
||||||
|
Bind(null, null, null, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Bind(IObservableCollection c, Func<object, Widget> makeWidget, Func<Widget, object, bool> widgetItemEquals, bool autoScroll)
|
||||||
|
{
|
||||||
|
this.autoScroll = autoScroll;
|
||||||
|
|
||||||
|
Game.RunAfterTick(() =>
|
||||||
|
{
|
||||||
|
if (collection != null)
|
||||||
|
{
|
||||||
|
collection.OnAdd -= BindingAdd;
|
||||||
|
collection.OnRemove -= BindingRemove;
|
||||||
|
collection.OnRemoveAt -= BindingRemoveAt;
|
||||||
|
collection.OnSet -= BindingSet;
|
||||||
|
collection.OnRefresh -= BindingRefresh;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.makeWidget = makeWidget;
|
||||||
|
this.widgetItemEquals = widgetItemEquals;
|
||||||
|
|
||||||
|
RemoveChildren();
|
||||||
|
collection = c;
|
||||||
|
|
||||||
|
if (c != null)
|
||||||
|
{
|
||||||
|
foreach (var item in c.ObservedItems)
|
||||||
|
BindingAddImpl(item);
|
||||||
|
|
||||||
|
c.OnAdd += BindingAdd;
|
||||||
|
c.OnRemove += BindingRemove;
|
||||||
|
c.OnRemoveAt += BindingRemoveAt;
|
||||||
|
c.OnSet += BindingSet;
|
||||||
|
c.OnRefresh += BindingRefresh;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingAdd(object item)
|
||||||
|
{
|
||||||
|
Game.RunAfterTick(() => BindingAddImpl(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingAddImpl(object item)
|
||||||
|
{
|
||||||
|
var widget = makeWidget(item);
|
||||||
|
var scrollToBottom = autoScroll && ScrolledToBottom;
|
||||||
|
|
||||||
|
AddChild(widget);
|
||||||
|
|
||||||
|
if (scrollToBottom)
|
||||||
|
ScrollToBottom();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingRemove(object item)
|
||||||
|
{
|
||||||
|
Game.RunAfterTick(() =>
|
||||||
|
{
|
||||||
|
var widget = Children.FirstOrDefault(w => widgetItemEquals(w, item));
|
||||||
|
if (widget != null)
|
||||||
|
RemoveChild(widget);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingRemoveAt(int index)
|
||||||
|
{
|
||||||
|
Game.RunAfterTick(() =>
|
||||||
|
{
|
||||||
|
if (index < 0 || index >= Children.Count)
|
||||||
|
return;
|
||||||
|
RemoveChild(Children[index]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingSet(object oldItem, object newItem)
|
||||||
|
{
|
||||||
|
Game.RunAfterTick(() =>
|
||||||
|
{
|
||||||
|
var newWidget = makeWidget(newItem);
|
||||||
|
newWidget.Parent = this;
|
||||||
|
|
||||||
|
var i = Children.FindIndex(w => widgetItemEquals(w, oldItem));
|
||||||
|
if (i >= 0)
|
||||||
|
{
|
||||||
|
var oldWidget = Children[i];
|
||||||
|
oldWidget.Removed();
|
||||||
|
Children[i] = newWidget;
|
||||||
|
Layout.AdjustChildren();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AddChild(newWidget);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void BindingRefresh()
|
||||||
|
{
|
||||||
|
Game.RunAfterTick(() =>
|
||||||
|
{
|
||||||
|
RemoveChildren();
|
||||||
|
foreach (var item in collection.ObservedItems)
|
||||||
|
BindingAddImpl(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace OpenRA.Widgets
|
|||||||
public Func<bool> OnTabKey = () => false;
|
public Func<bool> OnTabKey = () => false;
|
||||||
public Func<bool> OnEscKey = () => false;
|
public Func<bool> OnEscKey = () => false;
|
||||||
public Action OnLoseFocus = () => { };
|
public Action OnLoseFocus = () => { };
|
||||||
public int CursorPosition { get; protected set; }
|
public int CursorPosition { get; set; }
|
||||||
|
|
||||||
public Func<bool> IsDisabled = () => false;
|
public Func<bool> IsDisabled = () => false;
|
||||||
public Color TextColor = Color.White;
|
public Color TextColor = Color.White;
|
||||||
|
|||||||
27
OpenRA.Irc/Channel.cs
Normal file
27
OpenRA.Irc/Channel.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using OpenRA.FileFormats.Primitives;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class Channel
|
||||||
|
{
|
||||||
|
public readonly string Name;
|
||||||
|
public readonly ObservableSortedDictionary<string, User> Users = new ObservableSortedDictionary<string, User>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
public Topic Topic = new Topic();
|
||||||
|
|
||||||
|
public Channel(string name)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
402
OpenRA.Irc/IrcClient.cs
Normal file
402
OpenRA.Irc/IrcClient.cs
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
using OpenRA.FileFormats.Primitives;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class IrcClient : IDisposable
|
||||||
|
{
|
||||||
|
public static readonly IrcClient Instance = new IrcClient();
|
||||||
|
|
||||||
|
public static string MainChannel { get { return '#' + Game.Settings.Irc.Channel; } }
|
||||||
|
|
||||||
|
public static void AddHistory(string line)
|
||||||
|
{
|
||||||
|
Instance.History.Add("{0} {1}".F(DateTime.Now.ToString(Game.Settings.Irc.TimestampFormat), line));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddMessage(string nickname, string message)
|
||||||
|
{
|
||||||
|
AddHistory("{0}: {1}".F(nickname, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddNotice(string nickname, string message)
|
||||||
|
{
|
||||||
|
AddHistory("-{0}- {1}".F(nickname, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddSelfNotice(string nickname, string message)
|
||||||
|
{
|
||||||
|
AddHistory("-> -{0}- {1}".F(nickname, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddAction(string nickname, string message)
|
||||||
|
{
|
||||||
|
AddHistory("* {0} {1}".F(nickname, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void InstanceInitialize()
|
||||||
|
{
|
||||||
|
var s = Game.Settings.Irc;
|
||||||
|
|
||||||
|
Instance.OnPublicMessage += l =>
|
||||||
|
{
|
||||||
|
var action = IrcUtils.FromAction(l.Message);
|
||||||
|
if (action != null)
|
||||||
|
AddAction(l.Prefix.Nickname, action);
|
||||||
|
else
|
||||||
|
AddMessage(l.Prefix.Nickname, l.Message);
|
||||||
|
};
|
||||||
|
Instance.OnPrivateMessage += l =>
|
||||||
|
{
|
||||||
|
var ctcp = IrcUtils.FromCtcp(l.Message);
|
||||||
|
if (ctcp == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var split = ctcp.Split(new[] { ' ' }, 2);
|
||||||
|
var command = split[0];
|
||||||
|
if (command.EqualsIC("VERSION"))
|
||||||
|
{
|
||||||
|
var mod = Game.CurrentMods.Values.FirstOrDefault();
|
||||||
|
if (mod == null)
|
||||||
|
return;
|
||||||
|
Instance.CtcpRespond(l.Prefix.Nickname, command, "{0}: {1}".F(mod.Title, mod.Version));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Instance.OnPrivateNotice += l =>
|
||||||
|
{
|
||||||
|
if (l.Target == "*") // Drop pre-register notices
|
||||||
|
return;
|
||||||
|
AddNotice(l.Prefix.Nickname, l.Message);
|
||||||
|
};
|
||||||
|
Instance.OnRegister += l =>
|
||||||
|
{
|
||||||
|
Instance.Join(MainChannel);
|
||||||
|
Game.Settings.Irc.Nickname = Instance.LocalUser.Nickname;
|
||||||
|
Game.Settings.Save();
|
||||||
|
};
|
||||||
|
Instance.OnConnecting += () => AddHistory("Connecting");
|
||||||
|
Instance.OnConnect += () => AddHistory("Connected");
|
||||||
|
Instance.OnPart += l => AddHistory("{0} left{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : ""));
|
||||||
|
Instance.OnJoin += l => AddHistory("{0} joined".F(l.Prefix.Nickname));
|
||||||
|
Instance.OnQuit += l => AddHistory("{0} quit{1}".F(l.Prefix.Nickname, l.Message != null ? ": " + l.Message : ""));
|
||||||
|
Instance.OnKick += l => AddHistory("{0} kicked {1}{2}".F(l.Prefix.Nickname, l.KickeeNickname, l.Message != null ? ": " + l.Message : ""));
|
||||||
|
Instance.OnNicknameSet += l =>
|
||||||
|
{
|
||||||
|
AddHistory("{0} set their nickname to {1}".F(l.Prefix.Nickname, l.NewNickname));
|
||||||
|
if (l.NewNickname == Instance.LocalUser.Nickname)
|
||||||
|
{
|
||||||
|
Instance.Nickname = l.NewNickname;
|
||||||
|
Game.Settings.Irc.Nickname = l.NewNickname;
|
||||||
|
Game.Settings.Save();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Instance.OnTopicSet += l => AddHistory("{0} set the topic to {1}".F(l.Prefix.Nickname, l.Message));
|
||||||
|
Instance.OnNumeric += l =>
|
||||||
|
{
|
||||||
|
if (l.Numeric == NumericCommand.RPL_TOPIC)
|
||||||
|
{
|
||||||
|
var topic = Instance.GetChannel(MainChannel).Topic;
|
||||||
|
AddHistory("Topic is {0}".F(topic.Message));
|
||||||
|
}
|
||||||
|
else if (l.Numeric == NumericCommand.RPL_TOPICWHOTIME)
|
||||||
|
{
|
||||||
|
var topic = Instance.GetChannel(MainChannel).Topic;
|
||||||
|
AddHistory("Topic set by {0} at {1}".F(topic.Author.Nickname, topic.Time.ToLocalTime()));
|
||||||
|
}
|
||||||
|
else if (l.Numeric == NumericCommand.RPL_NOTOPIC)
|
||||||
|
AddHistory("No topic is set");
|
||||||
|
else if (l.Numeric == NumericCommand.ERR_NICKNAMEINUSE)
|
||||||
|
AddHistory("Nickname {0} is already in use".F(l.AltTarget));
|
||||||
|
else if (l.Numeric == NumericCommand.ERR_ERRONEUSNICKNAME)
|
||||||
|
AddHistory("Nickname {0} is erroneus".F(l.AltTarget));
|
||||||
|
};
|
||||||
|
Instance.OnDisconnect += () =>
|
||||||
|
{
|
||||||
|
if (Instance.ConnectionFailure != null)
|
||||||
|
{
|
||||||
|
AddHistory("Disconnected: {0}".F(Instance.ConnectionFailure.Message));
|
||||||
|
if (s.ReconnectDelay >= 0)
|
||||||
|
{
|
||||||
|
AddHistory("Reconnecting in {0} seconds".F(s.ReconnectDelay / 1000));
|
||||||
|
Instance.ConnectionState = IrcConnectionState.Reconnecting;
|
||||||
|
Game.RunAfterDelay(s.ReconnectDelay, () =>
|
||||||
|
{
|
||||||
|
if (Instance.IsReconnecting)
|
||||||
|
Instance.Connect(Instance.Hostname, Instance.Port, Instance.ConnectionTimeout, Instance.Nickname, Instance.Username, Instance.Realname);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
AddHistory("Disconnected");
|
||||||
|
};
|
||||||
|
Instance.OnLineRead += l =>
|
||||||
|
{
|
||||||
|
if (s.Debug)
|
||||||
|
AddHistory(l.RawString);
|
||||||
|
};
|
||||||
|
Game.OnQuit += Instance.Disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IrcClient()
|
||||||
|
{
|
||||||
|
Log.AddChannel("irc", "irc.log");
|
||||||
|
InstanceInitialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly ObservableCollection<string> History = new ObservableCollection<string>();
|
||||||
|
|
||||||
|
IrcConnection connection;
|
||||||
|
Thread thread;
|
||||||
|
public IrcConnectionState ConnectionState { get; private set; }
|
||||||
|
public IrcClientUser LocalUser { get; private set; }
|
||||||
|
public Exception ConnectionFailure { get; private set; }
|
||||||
|
|
||||||
|
public string Hostname { get; private set; }
|
||||||
|
public int Port { get; private set; }
|
||||||
|
public int ConnectionTimeout { get; private set; }
|
||||||
|
public string Nickname { get; private set; }
|
||||||
|
public string Username { get; private set; }
|
||||||
|
public string Realname { get; private set; }
|
||||||
|
|
||||||
|
public bool IsConnected
|
||||||
|
{
|
||||||
|
get { return ConnectionState == IrcConnectionState.Connected; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsReconnecting
|
||||||
|
{
|
||||||
|
get { return ConnectionState == IrcConnectionState.Reconnecting; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IrcClient()
|
||||||
|
{
|
||||||
|
ConnectionState = IrcConnectionState.Disconnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Connect(string hostname, int port, int connectionTimeout, string nickname, string username, string realname)
|
||||||
|
{
|
||||||
|
ConnectionFailure = null;
|
||||||
|
if (IsConnected)
|
||||||
|
Disconnect();
|
||||||
|
|
||||||
|
Hostname = hostname;
|
||||||
|
Port = port;
|
||||||
|
ConnectionTimeout = connectionTimeout;
|
||||||
|
Nickname = nickname;
|
||||||
|
Username = username;
|
||||||
|
Realname = realname;
|
||||||
|
|
||||||
|
thread = new Thread(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ConnectionState = IrcConnectionState.Connecting;
|
||||||
|
LocalUser = new IrcClientUser(this);
|
||||||
|
connection = new IrcConnection();
|
||||||
|
OnConnecting();
|
||||||
|
connection.Connect(hostname, port, connectionTimeout);
|
||||||
|
ConnectionState = IrcConnectionState.Connected;
|
||||||
|
OnConnect();
|
||||||
|
SetNickname(nickname);
|
||||||
|
SetUser(username, realname);
|
||||||
|
ProcessLines();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Write("irc", e.ToString());
|
||||||
|
if (e is SocketException || e is IOException)
|
||||||
|
ConnectionFailure = e;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Disconnect();
|
||||||
|
}
|
||||||
|
}) { IsBackground = true };
|
||||||
|
thread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteLine(string format, params object[] args)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
connection.WriteLine(format, args);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Write("irc", e.ToString());
|
||||||
|
if (e is SocketException || e is IOException)
|
||||||
|
ConnectionFailure = e;
|
||||||
|
Disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Disconnect()
|
||||||
|
{
|
||||||
|
if (!IsConnected || IsReconnecting)
|
||||||
|
{
|
||||||
|
ConnectionState = IrcConnectionState.Disconnected;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectionState = IrcConnectionState.Disconnecting;
|
||||||
|
OnDisconnecting();
|
||||||
|
connection.Close();
|
||||||
|
ConnectionState = IrcConnectionState.Disconnected;
|
||||||
|
OnDisconnect();
|
||||||
|
LocalUser = null;
|
||||||
|
connection = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IDisposable.Dispose()
|
||||||
|
{
|
||||||
|
Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessLines()
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
while (IsConnected && (line = connection.ReadLine()) != null)
|
||||||
|
ProcessLine(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessLine(string line)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(line))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var l = new Line(this, line);
|
||||||
|
OnLineRead(l);
|
||||||
|
|
||||||
|
int numeric;
|
||||||
|
if (int.TryParse(l.Command, out numeric))
|
||||||
|
{
|
||||||
|
var nl = new NumericLine(l, numeric);
|
||||||
|
LocalUser.OnNumeric(nl);
|
||||||
|
OnNumeric(nl);
|
||||||
|
switch (nl.Numeric)
|
||||||
|
{
|
||||||
|
case NumericCommand.RPL_WELCOME:
|
||||||
|
OnRegister(nl);
|
||||||
|
break;
|
||||||
|
case NumericCommand.RPL_ENDOFNAMES:
|
||||||
|
OnSync(nl);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (l.Command)
|
||||||
|
{
|
||||||
|
case "PING":
|
||||||
|
Pong(l.Message);
|
||||||
|
OnPing(l);
|
||||||
|
break;
|
||||||
|
case "PRIVMSG":
|
||||||
|
if (IrcUtils.IsChannel(l.Target))
|
||||||
|
OnPublicMessage(l);
|
||||||
|
else
|
||||||
|
OnPrivateMessage(l);
|
||||||
|
break;
|
||||||
|
case "NOTICE":
|
||||||
|
if (IrcUtils.IsChannel(l.Target))
|
||||||
|
OnPublicNotice(l);
|
||||||
|
else
|
||||||
|
OnPrivateNotice(l);
|
||||||
|
break;
|
||||||
|
case "JOIN":
|
||||||
|
var jl = new JoinLine(l);
|
||||||
|
LocalUser.OnJoin(jl);
|
||||||
|
OnJoin(jl);
|
||||||
|
break;
|
||||||
|
case "PART":
|
||||||
|
LocalUser.OnPart(l);
|
||||||
|
OnPart(l);
|
||||||
|
break;
|
||||||
|
case "NICK":
|
||||||
|
var nsl = new NicknameSetLine(l);
|
||||||
|
LocalUser.OnNicknameSet(nsl);
|
||||||
|
OnNicknameSet(nsl);
|
||||||
|
break;
|
||||||
|
case "QUIT":
|
||||||
|
OnQuit(l);
|
||||||
|
LocalUser.OnQuit(l);
|
||||||
|
break;
|
||||||
|
case "KICK":
|
||||||
|
var kl = new KickLine(l);
|
||||||
|
LocalUser.OnKick(kl);
|
||||||
|
OnKick(kl);
|
||||||
|
break;
|
||||||
|
case "TOPIC":
|
||||||
|
LocalUser.OnTopicSet(l);
|
||||||
|
OnTopicSet(l);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public event Action<NumericLine> OnRegister = l => { };
|
||||||
|
public event Action<NumericLine> OnSync = l => { };
|
||||||
|
public event Action<Line> OnLineRead = _ => { };
|
||||||
|
public event Action OnConnect = () => { };
|
||||||
|
public event Action OnConnecting = () => { };
|
||||||
|
public event Action OnDisconnect = () => { };
|
||||||
|
public event Action OnDisconnecting = () => { };
|
||||||
|
public event Action<Line> OnPublicMessage = _ => { };
|
||||||
|
public event Action<Line> OnPublicNotice = _ => { };
|
||||||
|
public event Action<Line> OnPrivateMessage = _ => { };
|
||||||
|
public event Action<Line> OnPrivateNotice = _ => { };
|
||||||
|
public event Action<JoinLine> OnJoin = _ => { };
|
||||||
|
public event Action<Line> OnPart = _ => { };
|
||||||
|
public event Action<NicknameSetLine> OnNicknameSet = _ => { };
|
||||||
|
public event Action<Line> OnQuit = _ => { };
|
||||||
|
public event Action<Line> OnPing = _ => { };
|
||||||
|
public event Action<NumericLine> OnNumeric = _ => { };
|
||||||
|
public event Action<KickLine> OnKick = _ => { };
|
||||||
|
public event Action<Line> OnTopicSet = _ => { };
|
||||||
|
|
||||||
|
public void SetNickname(string nickname) { WriteLine("NICK {0}", nickname); }
|
||||||
|
public void SetUser(string username, string realname) { WriteLine("USER {0} 0 * :{1}", username, realname); }
|
||||||
|
public void Join(string channel) { WriteLine("JOIN {0}", channel); }
|
||||||
|
public void Part(string channel) { WriteLine("PART {0}", channel); }
|
||||||
|
public void Message(string target, string message) { WriteLine("PRIVMSG {0} :{1}", target, message); }
|
||||||
|
public void Notice(string target, string message) { WriteLine("NOTICE {0} :{1}", target, message); }
|
||||||
|
public void Pong(string reply) { WriteLine("PONG :{0}", reply); }
|
||||||
|
public void CtcpRequest(string target, string command, string request) { Message(target, IrcUtils.ToCtcp("{0} {1}".F(command, request))); }
|
||||||
|
public void CtcpRespond(string target, string command, string response) { Notice(target, IrcUtils.ToCtcp("{0} {1}".F(command, response))); }
|
||||||
|
public void Act(string target, string message) { Message(target, IrcUtils.ToAction(message)); }
|
||||||
|
public void GetTopic(string channel) { WriteLine("TOPIC {0}", channel); }
|
||||||
|
public void Quit(string message) { WriteLine("QUIT :{0}", message); }
|
||||||
|
|
||||||
|
public Channel GetChannel(string channel)
|
||||||
|
{
|
||||||
|
if (!IsConnected)
|
||||||
|
return null;
|
||||||
|
Channel c;
|
||||||
|
LocalUser.Channels.TryGetValue(channel, out c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum IrcConnectionState
|
||||||
|
{
|
||||||
|
Disconnected,
|
||||||
|
Connected,
|
||||||
|
Disconnecting,
|
||||||
|
Connecting,
|
||||||
|
Reconnecting
|
||||||
|
}
|
||||||
|
}
|
||||||
112
OpenRA.Irc/IrcClientUser.cs
Normal file
112
OpenRA.Irc/IrcClientUser.cs
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenRA.FileFormats.Primitives;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class IrcClientUser : User
|
||||||
|
{
|
||||||
|
public readonly ObservableDictionary<string, Channel> Channels = new ObservableDictionary<string, Channel>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
public readonly IrcClient Client;
|
||||||
|
|
||||||
|
public IrcClientUser(IrcClient client)
|
||||||
|
{
|
||||||
|
Client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNumeric(NumericLine line)
|
||||||
|
{
|
||||||
|
switch (line.Numeric)
|
||||||
|
{
|
||||||
|
case NumericCommand.RPL_WELCOME:
|
||||||
|
new User(line.Message.Substring(line.Message.LastIndexOf(' ') + 1)).CopyTo(this);
|
||||||
|
break;
|
||||||
|
case NumericCommand.RPL_NAMREPLY:
|
||||||
|
{
|
||||||
|
var channel = line.GetChannel();
|
||||||
|
var nicknames = line.Message.Replace("~", "").Replace("&", "").Replace("@", "").Replace("%", "").Replace("+", "").Split(' ');
|
||||||
|
|
||||||
|
foreach (var nickname in nicknames.Where(n => !channel.Users.ContainsKey(n)))
|
||||||
|
channel.Users.Add(nickname, new User { Nickname = nickname });
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NumericCommand.RPL_TOPIC:
|
||||||
|
line.GetChannel().Topic.Message = line.Message;
|
||||||
|
break;
|
||||||
|
case NumericCommand.RPL_TOPICWHOTIME:
|
||||||
|
{
|
||||||
|
var topic = line.GetChannel().Topic;
|
||||||
|
topic.Author = new User(line[4]);
|
||||||
|
topic.Time = IrcUtils.DateTimeFromUnixTime(int.Parse(line[5]));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NumericCommand.ERR_NICKNAMEINUSE:
|
||||||
|
if (line.Target == "*") // no nickname set yet
|
||||||
|
Client.SetNickname(Client.Nickname + new Random().Next(10000, 99999));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnJoin(Line line)
|
||||||
|
{
|
||||||
|
if (line.PrefixIsSelf())
|
||||||
|
Channels.Add(line.Target, new Channel(line.Target));
|
||||||
|
|
||||||
|
line.GetChannel().Users.Add(line.Prefix.Nickname, new User(line.Prefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnPart(Line line)
|
||||||
|
{
|
||||||
|
line.GetChannel().Users.Remove(line.Prefix.Nickname);
|
||||||
|
|
||||||
|
if (line.PrefixIsSelf())
|
||||||
|
Channels.Remove(line.Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNicknameSet(NicknameSetLine line)
|
||||||
|
{
|
||||||
|
if (line.PrefixIsSelf())
|
||||||
|
Nickname = line.NewNickname;
|
||||||
|
|
||||||
|
foreach (var channel in Channels.Values.Where(c => c.Users.ContainsKey(line.Prefix.Nickname)))
|
||||||
|
{
|
||||||
|
var user = channel.Users[line.Prefix.Nickname];
|
||||||
|
channel.Users.Remove(line.Prefix.Nickname);
|
||||||
|
user.Nickname = line.NewNickname;
|
||||||
|
channel.Users.Add(line.NewNickname, user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnQuit(Line line)
|
||||||
|
{
|
||||||
|
foreach (var channel in Channels)
|
||||||
|
channel.Value.Users.Remove(line.Prefix.Nickname);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnKick(KickLine line)
|
||||||
|
{
|
||||||
|
line.GetChannel().Users.Remove(line.KickeeNickname);
|
||||||
|
|
||||||
|
if (line.KickeeNickname.EqualsIC(Nickname))
|
||||||
|
Channels.Remove(line.Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnTopicSet(Line line)
|
||||||
|
{
|
||||||
|
var topic = line.GetChannel().Topic;
|
||||||
|
topic.Message = line.Message;
|
||||||
|
topic.Author = line.Prefix;
|
||||||
|
topic.Time = DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
83
OpenRA.Irc/IrcConnection.cs
Normal file
83
OpenRA.Irc/IrcConnection.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class IrcConnection : IDisposable
|
||||||
|
{
|
||||||
|
TcpClient socket;
|
||||||
|
Stream stream;
|
||||||
|
StreamWriter writer;
|
||||||
|
StreamReader reader;
|
||||||
|
bool disposed;
|
||||||
|
|
||||||
|
public void Connect(string hostname, int port, int connectionTimeout)
|
||||||
|
{
|
||||||
|
CheckDisposed();
|
||||||
|
if (socket != null && socket.Connected)
|
||||||
|
throw new InvalidOperationException("Socket already connected");
|
||||||
|
|
||||||
|
socket = new TcpClient(hostname, port);
|
||||||
|
socket.ReceiveTimeout = socket.SendTimeout = connectionTimeout;
|
||||||
|
stream = socket.GetStream();
|
||||||
|
writer = new StreamWriter(stream) { AutoFlush = true };
|
||||||
|
reader = new StreamReader(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteLine(string format, params object[] args)
|
||||||
|
{
|
||||||
|
CheckDisposed();
|
||||||
|
writer.WriteLine(format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ReadLine()
|
||||||
|
{
|
||||||
|
CheckDisposed();
|
||||||
|
return reader.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
CloseImpl();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloseImpl()
|
||||||
|
{
|
||||||
|
if (disposed) return;
|
||||||
|
|
||||||
|
disposed = true;
|
||||||
|
if (socket != null) socket.Close();
|
||||||
|
if (stream != null) stream.Close();
|
||||||
|
if (writer != null) writer.Close();
|
||||||
|
if (reader != null) reader.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IDisposable.Dispose()
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
~IrcConnection()
|
||||||
|
{
|
||||||
|
CloseImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckDisposed()
|
||||||
|
{
|
||||||
|
if (disposed)
|
||||||
|
throw new ObjectDisposedException(GetType().FullName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
67
OpenRA.Irc/IrcUtils.cs
Normal file
67
OpenRA.Irc/IrcUtils.cs
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public static class IrcUtils
|
||||||
|
{
|
||||||
|
public static bool IsChannel(string s)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(s) && s[0] == '#';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsNickname(string s)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(s) && (char.IsLetter(s[0]) || NicknameSpecialChars.Contains(s[0]))
|
||||||
|
&& s.Substring(1).All(c => char.IsLetterOrDigit(c) || NicknameSpecialChars.Contains(c) || c == '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
const string NicknameSpecialChars = @"[]\`_^{|}";
|
||||||
|
|
||||||
|
public static DateTime DateTimeFromUnixTime(int seconds)
|
||||||
|
{
|
||||||
|
return new DateTime(1970, 1, 1).AddSeconds(seconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool EqualsIC(this string a, string b)
|
||||||
|
{
|
||||||
|
return a.Equals(b, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string FromCtcp(string message)
|
||||||
|
{
|
||||||
|
if (message.Length < 2 || !message.StartsWith("\x0001") || !message.EndsWith("\x0001"))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return message.Substring(1, message.Length - 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToCtcp(string message)
|
||||||
|
{
|
||||||
|
return "\x0001{0}\x0001".F(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string FromAction(string message)
|
||||||
|
{
|
||||||
|
if (!message.StartsWith("\x0001ACTION ") || !message.EndsWith("\x0001"))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return message.Substring(8, message.Length - 8 - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string ToAction(string message)
|
||||||
|
{
|
||||||
|
return "\x0001ACTION {0}\x0001".F(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
155
OpenRA.Irc/Line.cs
Normal file
155
OpenRA.Irc/Line.cs
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class Line
|
||||||
|
{
|
||||||
|
public readonly IrcClient Client;
|
||||||
|
public readonly string RawString;
|
||||||
|
public readonly string[] RawStringParts;
|
||||||
|
public readonly User Prefix;
|
||||||
|
public readonly string Command;
|
||||||
|
public string Target { get; protected set; }
|
||||||
|
public string Message { get; protected set; }
|
||||||
|
|
||||||
|
public Line(Line line)
|
||||||
|
{
|
||||||
|
Client = line.Client;
|
||||||
|
RawString = line.RawString;
|
||||||
|
RawStringParts = line.RawStringParts;
|
||||||
|
Prefix = line.Prefix;
|
||||||
|
Command = line.Command;
|
||||||
|
Target = line.Target;
|
||||||
|
Message = line.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Line(IrcClient client, string line)
|
||||||
|
{
|
||||||
|
RawString = line;
|
||||||
|
RawStringParts = line.Split(' ');
|
||||||
|
Client = client;
|
||||||
|
|
||||||
|
if (line[0] == ':')
|
||||||
|
{
|
||||||
|
line = line.Substring(1);
|
||||||
|
var prefixDelim = line.Split(new[] { ' ' }, 2);
|
||||||
|
Prefix = new User(prefixDelim[0]);
|
||||||
|
|
||||||
|
if (prefixDelim.Length > 1)
|
||||||
|
{
|
||||||
|
var messageDelim = prefixDelim[1].Split(new[] { ':' }, 2);
|
||||||
|
|
||||||
|
var args = messageDelim[0].Trim().Split(' ');
|
||||||
|
|
||||||
|
Command = args[0];
|
||||||
|
if (args.Length > 1)
|
||||||
|
Target = args[1];
|
||||||
|
|
||||||
|
if (messageDelim.Length > 1)
|
||||||
|
Message = messageDelim[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var messageDelim = line.Split(new[] { ':' }, 2);
|
||||||
|
|
||||||
|
var args = messageDelim[0].Trim().Split(' ');
|
||||||
|
|
||||||
|
Command = args[0];
|
||||||
|
if (args.Length > 1)
|
||||||
|
Target = args[1];
|
||||||
|
|
||||||
|
if (messageDelim.Length > 1)
|
||||||
|
Message = messageDelim[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Channel GetChannel()
|
||||||
|
{
|
||||||
|
return Client.GetChannel(Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string this[int index]
|
||||||
|
{
|
||||||
|
get { return RawStringParts[index]; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool PrefixIsSelf()
|
||||||
|
{
|
||||||
|
return Client.LocalUser != null && Prefix.Nickname.EqualsIC(Client.LocalUser.Nickname);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TargetIsSelf()
|
||||||
|
{
|
||||||
|
return Target != null && Target.EqualsIC(Client.LocalUser.Nickname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NicknameSetLine : Line
|
||||||
|
{
|
||||||
|
public readonly string NewNickname;
|
||||||
|
|
||||||
|
public NicknameSetLine(Line line)
|
||||||
|
: base(line)
|
||||||
|
{
|
||||||
|
NewNickname = Message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NumericLine : Line
|
||||||
|
{
|
||||||
|
public readonly NumericCommand Numeric;
|
||||||
|
public readonly string AltTarget;
|
||||||
|
|
||||||
|
public override Channel GetChannel()
|
||||||
|
{
|
||||||
|
if (IrcUtils.IsChannel(AltTarget))
|
||||||
|
return Client.GetChannel(AltTarget);
|
||||||
|
return Client.GetChannel(Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NumericLine(Line line, int numeric)
|
||||||
|
: base(line)
|
||||||
|
{
|
||||||
|
if (!IrcUtils.IsChannel(Target))
|
||||||
|
{
|
||||||
|
var numericParts = line.RawStringParts.Skip(1).TakeWhile(p => !p.StartsWith(":"));
|
||||||
|
AltTarget = numericParts.LastOrDefault(IrcUtils.IsChannel);
|
||||||
|
if (AltTarget == null)
|
||||||
|
AltTarget = numericParts.LastOrDefault();
|
||||||
|
}
|
||||||
|
Numeric = (NumericCommand)numeric;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class JoinLine : Line // for compatibility with certain IRCds
|
||||||
|
{
|
||||||
|
public JoinLine(Line line)
|
||||||
|
: base(line)
|
||||||
|
{
|
||||||
|
if (Message != null) // don't overwrite the target if it was already set properly by the IRCd
|
||||||
|
Target = Message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class KickLine : Line
|
||||||
|
{
|
||||||
|
public readonly string KickeeNickname;
|
||||||
|
|
||||||
|
public KickLine(Line line)
|
||||||
|
: base(line)
|
||||||
|
{
|
||||||
|
KickeeNickname = this[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
OpenRA.Irc/NumericCommand.cs
Normal file
25
OpenRA.Irc/NumericCommand.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public enum NumericCommand
|
||||||
|
{
|
||||||
|
Undefined = 0,
|
||||||
|
RPL_WELCOME = 001,
|
||||||
|
RPL_NOTOPIC = 331,
|
||||||
|
RPL_TOPIC = 332,
|
||||||
|
RPL_TOPICWHOTIME = 333,
|
||||||
|
RPL_NAMREPLY = 353,
|
||||||
|
RPL_ENDOFNAMES = 366,
|
||||||
|
ERR_ERRONEUSNICKNAME = 432,
|
||||||
|
ERR_NICKNAMEINUSE = 433
|
||||||
|
}
|
||||||
|
}
|
||||||
70
OpenRA.Irc/OpenRA.Irc.csproj
Normal file
70
OpenRA.Irc/OpenRA.Irc.csproj
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{85B48234-8B31-4BE6-AF9C-665CC6866841}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>OpenRA.Irc</RootNamespace>
|
||||||
|
<AssemblyName>OpenRA.Irc</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkProfile>
|
||||||
|
</TargetFrameworkProfile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>..</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Channel.cs" />
|
||||||
|
<Compile Include="IrcClient.cs" />
|
||||||
|
<Compile Include="IrcClientUser.cs" />
|
||||||
|
<Compile Include="IrcConnection.cs" />
|
||||||
|
<Compile Include="IrcUtils.cs" />
|
||||||
|
<Compile Include="Line.cs" />
|
||||||
|
<Compile Include="NumericCommand.cs" />
|
||||||
|
<Compile Include="Topic.cs" />
|
||||||
|
<Compile Include="User.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Properties\" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">
|
||||||
|
<Project>{bdaeab25-991e-46a7-af1e-4f0e03358daa}</Project>
|
||||||
|
<Name>OpenRA.FileFormats</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">
|
||||||
|
<Project>{0dfb103f-2962-400f-8c6d-e2c28ccba633}</Project>
|
||||||
|
<Name>OpenRA.Game</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
30
OpenRA.Irc/Topic.cs
Normal file
30
OpenRA.Irc/Topic.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class Topic
|
||||||
|
{
|
||||||
|
public string Message;
|
||||||
|
public User Author;
|
||||||
|
public DateTime Time;
|
||||||
|
|
||||||
|
public Topic() { }
|
||||||
|
|
||||||
|
public Topic(string message, User author, DateTime time)
|
||||||
|
{
|
||||||
|
Message = message;
|
||||||
|
Author = author;
|
||||||
|
Time = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
73
OpenRA.Irc/User.cs
Normal file
73
OpenRA.Irc/User.cs
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenRA.Irc
|
||||||
|
{
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
public string Nickname;
|
||||||
|
public string Username;
|
||||||
|
public string Hostname;
|
||||||
|
|
||||||
|
public User() { }
|
||||||
|
|
||||||
|
public User(User user)
|
||||||
|
{
|
||||||
|
Nickname = user.Nickname;
|
||||||
|
Username = user.Username;
|
||||||
|
Hostname = user.Hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(User user)
|
||||||
|
{
|
||||||
|
user.Nickname = Nickname;
|
||||||
|
user.Username = Username;
|
||||||
|
user.Hostname = Hostname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public User(string prefix)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(prefix))
|
||||||
|
throw new ArgumentException();
|
||||||
|
|
||||||
|
var ex = prefix.IndexOf('!');
|
||||||
|
var at = prefix.IndexOf('@');
|
||||||
|
|
||||||
|
if (ex >= 0 && at >= 0 && at < ex)
|
||||||
|
throw new ArgumentException("Bogus input string: @ before !");
|
||||||
|
|
||||||
|
if (ex >= 0)
|
||||||
|
{
|
||||||
|
Nickname = prefix.Substring(0, ex);
|
||||||
|
if (at >= 0)
|
||||||
|
{
|
||||||
|
Username = prefix.Substring(ex + 1, at - ex - 1);
|
||||||
|
Hostname = prefix.Substring(at + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Username = prefix.Substring(ex + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Nickname = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
var ret = "" + Nickname;
|
||||||
|
if (Username != null)
|
||||||
|
ret += "!" + Username;
|
||||||
|
if (Hostname != null)
|
||||||
|
ret += "@" + Hostname;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -380,6 +380,7 @@
|
|||||||
<Compile Include="Widgets\BuildPaletteWidget.cs" />
|
<Compile Include="Widgets\BuildPaletteWidget.cs" />
|
||||||
<Compile Include="Widgets\LogicTickerWidget.cs" />
|
<Compile Include="Widgets\LogicTickerWidget.cs" />
|
||||||
<Compile Include="Widgets\Logic\IngameMenuLogic.cs" />
|
<Compile Include="Widgets\Logic\IngameMenuLogic.cs" />
|
||||||
|
<Compile Include="Widgets\Logic\IrcLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\KickClientLogic.cs" />
|
<Compile Include="Widgets\Logic\KickClientLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\ModBrowserLogic.cs" />
|
<Compile Include="Widgets\Logic\ModBrowserLogic.cs" />
|
||||||
<Compile Include="Widgets\Logic\ColorPickerLogic.cs" />
|
<Compile Include="Widgets\Logic\ColorPickerLogic.cs" />
|
||||||
@@ -482,6 +483,10 @@
|
|||||||
<Name>OpenRA.Game</Name>
|
<Name>OpenRA.Game</Name>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\OpenRA.Irc\OpenRA.Irc.csproj">
|
||||||
|
<Project>{85b48234-8b31-4be6-af9c-665cc6866841}</Project>
|
||||||
|
<Name>OpenRA.Irc</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\OpenRA.Utility\OpenRA.Utility.csproj">
|
<ProjectReference Include="..\OpenRA.Utility\OpenRA.Utility.csproj">
|
||||||
<Project>{F33337BE-CB69-4B24-850F-07D23E408DDF}</Project>
|
<Project>{F33337BE-CB69-4B24-850F-07D23E408DDF}</Project>
|
||||||
<Name>OpenRA.Utility</Name>
|
<Name>OpenRA.Utility</Name>
|
||||||
|
|||||||
252
OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs
Normal file
252
OpenRA.Mods.RA/Widgets/Logic/IrcLogic.cs
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation. For more information,
|
||||||
|
* see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenRA.Irc;
|
||||||
|
using OpenRA.Widgets;
|
||||||
|
|
||||||
|
namespace OpenRA.Mods.RA.Widgets.Logic
|
||||||
|
{
|
||||||
|
class IrcLogic
|
||||||
|
{
|
||||||
|
TextFieldWidget inputBox;
|
||||||
|
TextFieldWidget nicknameBox;
|
||||||
|
Widget connectBG;
|
||||||
|
Widget ircContainer;
|
||||||
|
|
||||||
|
[ObjectCreator.UseCtor]
|
||||||
|
public IrcLogic(Widget widget)
|
||||||
|
{
|
||||||
|
var historyPanel = widget.Get<ScrollPanelWidget>("HISTORY_PANEL");
|
||||||
|
var historyTemplate = widget.Get<LabelWidget>("HISTORY_TEMPLATE");
|
||||||
|
var nicknamePanel = widget.Get<ScrollPanelWidget>("NICKNAME_PANEL");
|
||||||
|
var nicknameTemplate = widget.Get<LabelWidget>("NICKNAME_TEMPLATE");
|
||||||
|
|
||||||
|
inputBox = widget.Get<TextFieldWidget>("INPUT_BOX");
|
||||||
|
inputBox.OnEnterKey = EnterPressed;
|
||||||
|
inputBox.OnTabKey = TabPressed;
|
||||||
|
inputBox.IsDisabled = () => IrcClient.Instance.GetChannel(IrcClient.MainChannel) == null;
|
||||||
|
|
||||||
|
nicknameBox = widget.Get<TextFieldWidget>("NICKNAME_BOX");
|
||||||
|
nicknameBox.Text = ChooseNickname(Game.Settings.Irc.Nickname);
|
||||||
|
|
||||||
|
connectBG = widget.Get("IRC_CONNECT_BG");
|
||||||
|
ircContainer = widget.Get("IRC_CONTAINER");
|
||||||
|
|
||||||
|
widget.Get<ButtonWidget>("DISCONNECT_BUTTON").OnClick = IrcClient.Instance.Disconnect;
|
||||||
|
|
||||||
|
MaybeShowConnectPanel();
|
||||||
|
|
||||||
|
historyPanel.Bind(IrcClient.Instance.History, item => MakeLabelWidget(historyTemplate, item), LabelItemEquals, true);
|
||||||
|
|
||||||
|
var mainChannel = IrcClient.Instance.GetChannel(IrcClient.MainChannel);
|
||||||
|
if (mainChannel != null)
|
||||||
|
nicknamePanel.Bind(mainChannel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false);
|
||||||
|
|
||||||
|
IrcClient.Instance.OnSync += l =>
|
||||||
|
{
|
||||||
|
var channel = l.GetChannel();
|
||||||
|
if (channel.Name.EqualsIC(IrcClient.MainChannel))
|
||||||
|
nicknamePanel.Bind(channel.Users, item => MakeLabelWidget(nicknameTemplate, item), LabelItemEquals, false);
|
||||||
|
};
|
||||||
|
IrcClient.Instance.OnKick += l =>
|
||||||
|
{
|
||||||
|
if (l.KickeeNickname.EqualsIC(IrcClient.Instance.LocalUser.Nickname) && l.Target.EqualsIC(IrcClient.MainChannel))
|
||||||
|
nicknamePanel.Unbind();
|
||||||
|
};
|
||||||
|
IrcClient.Instance.OnPart += l =>
|
||||||
|
{
|
||||||
|
if (l.PrefixIsSelf() && l.Target.EqualsIC(IrcClient.MainChannel))
|
||||||
|
nicknamePanel.Unbind();
|
||||||
|
};
|
||||||
|
IrcClient.Instance.OnDisconnect += () =>
|
||||||
|
{
|
||||||
|
nicknamePanel.Unbind();
|
||||||
|
MaybeShowConnectPanel();
|
||||||
|
};
|
||||||
|
|
||||||
|
commands.Add("me", args =>
|
||||||
|
{
|
||||||
|
IrcClient.Instance.Act(IrcClient.MainChannel, args);
|
||||||
|
IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, args);
|
||||||
|
});
|
||||||
|
commands.Add("slap", args =>
|
||||||
|
{
|
||||||
|
IrcClient.Instance.Act(IrcClient.MainChannel, "slaps {0} around a bit with a large trout".F(args));
|
||||||
|
IrcClient.AddAction(IrcClient.Instance.LocalUser.Nickname, "slaps {0} around a bit with a large trout".F(args));
|
||||||
|
});
|
||||||
|
commands.Add("notice", args =>
|
||||||
|
{
|
||||||
|
var split = args.Split(new[] { ' ' }, 2);
|
||||||
|
if (split.Length < 2)
|
||||||
|
{
|
||||||
|
IrcClient.AddHistory("/notice: Not enough arguments");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IrcClient.Instance.Notice(split[0], split[1]);
|
||||||
|
IrcClient.AddSelfNotice(split[0], split[1]);
|
||||||
|
});
|
||||||
|
commands.Add("disconnect", args =>
|
||||||
|
{
|
||||||
|
Game.Settings.Irc.ConnectAutomatically = false;
|
||||||
|
Game.Settings.Save();
|
||||||
|
IrcClient.Instance.Disconnect();
|
||||||
|
});
|
||||||
|
commands.Add("quit", args =>
|
||||||
|
{
|
||||||
|
Game.Settings.Irc.ConnectAutomatically = false;
|
||||||
|
Game.Settings.Save();
|
||||||
|
if (IrcClient.Instance.IsConnected)
|
||||||
|
IrcClient.Instance.Quit(args);
|
||||||
|
else
|
||||||
|
IrcClient.Instance.Disconnect();
|
||||||
|
});
|
||||||
|
commands.Add("nick", args => IrcClient.Instance.SetNickname(args));
|
||||||
|
commands.Add("topic", args => IrcClient.Instance.GetTopic(IrcClient.MainChannel));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MaybeShowConnectPanel()
|
||||||
|
{
|
||||||
|
if (IrcClient.Instance.IsConnected || IrcClient.Instance.IsReconnecting)
|
||||||
|
{
|
||||||
|
ircContainer.Visible = true;
|
||||||
|
connectBG.Visible = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Game.Settings.Irc.ConnectAutomatically)
|
||||||
|
{
|
||||||
|
ircContainer.Visible = true;
|
||||||
|
connectBG.Visible = false;
|
||||||
|
Connect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircContainer.Visible = false;
|
||||||
|
connectBG.Visible = true;
|
||||||
|
|
||||||
|
var connectAutomaticallyCheckBox = connectBG.Get<CheckboxWidget>("CONNECT_AUTOMATICALLY_CHECKBOX");
|
||||||
|
var connectAutomaticallyChecked = false;
|
||||||
|
connectAutomaticallyCheckBox.IsChecked = () => connectAutomaticallyChecked;
|
||||||
|
connectAutomaticallyCheckBox.OnClick = () => connectAutomaticallyChecked ^= true;
|
||||||
|
|
||||||
|
var connectButton = connectBG.Get<ButtonWidget>("CONNECT_BUTTON");
|
||||||
|
|
||||||
|
connectButton.OnClick = () =>
|
||||||
|
{
|
||||||
|
ircContainer.Visible = true;
|
||||||
|
connectBG.Visible = false;
|
||||||
|
|
||||||
|
Game.Settings.Irc.ConnectAutomatically = connectAutomaticallyCheckBox.IsChecked();
|
||||||
|
Game.Settings.Save();
|
||||||
|
Connect();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
string ChooseNickname(string nickname)
|
||||||
|
{
|
||||||
|
if (!IrcUtils.IsNickname(nickname))
|
||||||
|
{
|
||||||
|
nickname = Game.Settings.Player.Name;
|
||||||
|
if (!IrcUtils.IsNickname(nickname))
|
||||||
|
nickname = Game.Settings.Irc.DefaultNickname;
|
||||||
|
}
|
||||||
|
return nickname;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Connect()
|
||||||
|
{
|
||||||
|
var nickname = ChooseNickname(nicknameBox.Text);
|
||||||
|
var s = Game.Settings.Irc;
|
||||||
|
s.Nickname = nickname;
|
||||||
|
Game.Settings.Save();
|
||||||
|
IrcClient.Instance.Connect(s.Hostname, s.Port, s.ConnectionTimeout, nickname, s.Username ?? nickname, s.Realname ?? nickname);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget MakeLabelWidget(LabelWidget template, object item)
|
||||||
|
{
|
||||||
|
var itemString = item.ToString();
|
||||||
|
var widget = (LabelWidget)template.Clone();
|
||||||
|
var font = Game.Renderer.Fonts[widget.Font];
|
||||||
|
itemString = WidgetUtils.WrapText(itemString, widget.Bounds.Width, font);
|
||||||
|
widget.Bounds.Height = font.Measure(itemString).Y;
|
||||||
|
widget.GetText = () => itemString;
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LabelItemEquals(Widget widget, object item)
|
||||||
|
{
|
||||||
|
return item != null && ((LabelWidget)widget).GetText() == item.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EnterPressed()
|
||||||
|
{
|
||||||
|
if (!inputBox.Text.Any())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
var text = inputBox.Text;
|
||||||
|
inputBox.Text = "";
|
||||||
|
|
||||||
|
if (text[0] == '/')
|
||||||
|
{
|
||||||
|
var parts = text.Split(new[] { ' ' }, 2);
|
||||||
|
var name = parts[0].Substring(1);
|
||||||
|
var args = parts.Length > 1 ? parts[1] : null;
|
||||||
|
|
||||||
|
Action<string> command;
|
||||||
|
if (!commands.TryGetValue(name, out command))
|
||||||
|
{
|
||||||
|
IrcClient.AddHistory("{0}: Unknown command".F(name));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
command(args);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IrcClient.Instance.Message(IrcClient.MainChannel, text);
|
||||||
|
IrcClient.AddMessage(IrcClient.Instance.LocalUser.Nickname, text);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary<string, Action<string>> commands = new Dictionary<string, Action<string>>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
List<string> tabMatches = new List<string>();
|
||||||
|
int tabMatchesIndex = -1;
|
||||||
|
|
||||||
|
bool TabPressed()
|
||||||
|
{
|
||||||
|
if (!inputBox.Text.Any())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
var channel = IrcClient.Instance.GetChannel(IrcClient.MainChannel);
|
||||||
|
|
||||||
|
if (channel == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
var spaceIndex = inputBox.Text.TrimEnd().LastIndexOf(' ');
|
||||||
|
var tabMatchtext = inputBox.Text.Substring(spaceIndex + 1);
|
||||||
|
|
||||||
|
if (tabMatchesIndex < 0 || !tabMatches.Any() || tabMatchtext != tabMatches[tabMatchesIndex])
|
||||||
|
tabMatches = channel.Users.Keys.Where(u => u.StartsWith(tabMatchtext, StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
|
||||||
|
if (!tabMatches.Any())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
tabMatchesIndex = (tabMatchesIndex + 1) % tabMatches.Count;
|
||||||
|
inputBox.Text = inputBox.Text.Remove(spaceIndex + 1) + tabMatches[tabMatchesIndex];
|
||||||
|
inputBox.CursorPosition = inputBox.Text.Length;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -101,6 +101,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; ServerList.Query(games => RefreshServerList(panel, games)); };
|
showIncompatibleCheckbox.OnClick = () => { showIncompatible ^= true; ServerList.Query(games => RefreshServerList(panel, games)); };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Game.LoadWidget(null, "SERVERBROWSER_IRC", panel.Get("IRC_ROOT"), new WidgetArgs());
|
||||||
|
|
||||||
ServerList.Query(games => RefreshServerList(panel, games));
|
ServerList.Query(games => RefreshServerList(panel, games));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
216
OpenRA.sln
216
OpenRA.sln
@@ -37,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Mods.TS", "OpenRA.Mo
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GeoIP", "GeoIP\GeoIP.csproj", "{021DDD6A-A608-424C-9A9A-252D8A9989E0}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GeoIP", "GeoIP\GeoIP.csproj", "{021DDD6A-A608-424C-9A9A-252D8A9989E0}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRA.Irc", "OpenRA.Irc\OpenRA.Irc.csproj", "{85B48234-8B31-4BE6-AF9C-665CC6866841}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -45,85 +47,6 @@ Global
|
|||||||
Release|Mixed Platforms = Release|Mixed Platforms
|
Release|Mixed Platforms = Release|Mixed Platforms
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Any CPU.ActiveCfg = Debug|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Any CPU.Build.0 = Debug|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Any CPU.ActiveCfg = Release|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
|
||||||
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Mixed Platforms.Build.0 = Release|x86
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
@@ -132,30 +55,53 @@ Global
|
|||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Any CPU.Build.0 = Release|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{BDAEAB25-991E-46A7-AF1E-4F0E03358DAA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Any CPU.Build.0 = Debug|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Any CPU.Build.0 = Release|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{0DFB103F-2962-400F-8C6D-E2C28CCBA633}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||||
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{4A8A43B5-A9EF-4ED0-99DD-4BAB10A0DB6E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Any CPU.Build.0 = Release|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{2881135D-4D62-493E-8F83-5EEE92CCC6BE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{67CF1A10-C5F6-48FA-B1A7-FE83BE4CE2CC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{00038B75-405B-44F5-8691-BD2546DBE224}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{1A8E50CC-EE32-4E57-8842-0C39C8EA7541}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
@@ -164,6 +110,70 @@ Global
|
|||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Any CPU.Build.0 = Release|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{F9FA4D9F-2302-470A-8A07-6E37F488C124}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{F33337BE-CB69-4B24-850F-07D23E408DDF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{0C4AEC1A-E7D5-4114-8CCD-3EEC82872981}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{E9C01A96-C3E2-4772-825B-A740AC513D31}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{52FD9F0B-B209-4ED7-8A32-AC8033363263}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{C0B0465C-6BE2-409C-8770-3A9BF64C4344}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{5457CBF5-4CE4-421E-A8BF-9FD6C9732E1D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{021DDD6A-A608-424C-9A9A-252D8A9989E0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{85B48234-8B31-4BE6-AF9C-665CC6866841}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(MonoDevelopProperties) = preSolution
|
GlobalSection(MonoDevelopProperties) = preSolution
|
||||||
StartupItem = OpenRA.Game\OpenRA.Game.csproj
|
StartupItem = OpenRA.Game\OpenRA.Game.csproj
|
||||||
|
|||||||
68
mods/cnc/chrome/irc.yaml
Normal file
68
mods/cnc/chrome/irc.yaml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
Container@SERVERBROWSER_IRC:
|
||||||
|
Logic:IrcLogic
|
||||||
|
Width:700
|
||||||
|
Height:250
|
||||||
|
Children:
|
||||||
|
Container@IRC_CONTAINER:
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Children:
|
||||||
|
ScrollPanel@HISTORY_PANEL:
|
||||||
|
Width:565
|
||||||
|
Height:PARENT_BOTTOM - 30
|
||||||
|
ItemSpacing:5
|
||||||
|
Label@HISTORY_TEMPLATE:
|
||||||
|
X:5
|
||||||
|
Width:530
|
||||||
|
Height:25
|
||||||
|
WordWrap:True
|
||||||
|
TextField@INPUT_BOX:
|
||||||
|
Y:PARENT_BOTTOM - 25
|
||||||
|
Width:565
|
||||||
|
Height:25
|
||||||
|
ScrollPanel@NICKNAME_PANEL:
|
||||||
|
X:570
|
||||||
|
Width:130
|
||||||
|
Height:PARENT_BOTTOM - 30
|
||||||
|
Label@NICKNAME_TEMPLATE:
|
||||||
|
X:5
|
||||||
|
Button@DISCONNECT_BUTTON:
|
||||||
|
X:570
|
||||||
|
Y:PARENT_BOTTOM - 25
|
||||||
|
Width:130
|
||||||
|
Height:25
|
||||||
|
Text:Disconnect
|
||||||
|
Font:Bold
|
||||||
|
Background@IRC_CONNECT_BG:
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Background:scrollpanel-bg
|
||||||
|
Children:
|
||||||
|
Label@GLOBAL_CHAT_LABEL:
|
||||||
|
Y:PARENT_BOTTOM / 4
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Align:Center
|
||||||
|
Text:Global Chat
|
||||||
|
Font:Bold
|
||||||
|
Label@NICKNAME_LABEL:
|
||||||
|
X:200
|
||||||
|
Y:PARENT_BOTTOM / 4 + 35
|
||||||
|
Text:Nickname:
|
||||||
|
TextField@NICKNAME_BOX:
|
||||||
|
X:270
|
||||||
|
Y:PARENT_BOTTOM / 4 + 25
|
||||||
|
Width:150
|
||||||
|
Height:25
|
||||||
|
Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX:
|
||||||
|
X:270
|
||||||
|
Y:PARENT_BOTTOM / 4 + 75
|
||||||
|
Height:20
|
||||||
|
Width:180
|
||||||
|
Text:Connect Automatically
|
||||||
|
Button@CONNECT_BUTTON:
|
||||||
|
X:430
|
||||||
|
Y:PARENT_BOTTOM / 4 + 25
|
||||||
|
Width:100
|
||||||
|
Height:25
|
||||||
|
Text:Connect
|
||||||
|
Font:Bold
|
||||||
@@ -1,27 +1,31 @@
|
|||||||
Container@SERVERBROWSER_PANEL:
|
Container@SERVERBROWSER_PANEL:
|
||||||
Logic:ServerBrowserLogic
|
Logic:ServerBrowserLogic
|
||||||
X:(WINDOW_RIGHT - WIDTH)/2
|
X:(WINDOW_RIGHT - WIDTH)/2
|
||||||
Y:(WINDOW_BOTTOM - 500)/2
|
Y:(WINDOW_BOTTOM - HEIGHT)/2
|
||||||
Width:540
|
Width:730
|
||||||
Height:535
|
Height:645
|
||||||
Children:
|
Children:
|
||||||
Label@TITLE:
|
Label@TITLE:
|
||||||
Text:Find Server
|
Text:Find Server
|
||||||
Width:540
|
Width:740
|
||||||
Y:0-25
|
Y:0-10
|
||||||
Font:BigBold
|
Font:BigBold
|
||||||
Contrast:true
|
Contrast:true
|
||||||
Align:Center
|
Align:Center
|
||||||
Background@bg:
|
Background@bg:
|
||||||
Width:540
|
Width:730
|
||||||
Height:500
|
Height:600
|
||||||
Background:panel-black
|
Background:panel-black
|
||||||
|
Y:15
|
||||||
Children:
|
Children:
|
||||||
|
Container@IRC_ROOT:
|
||||||
|
X:15
|
||||||
|
Y:15
|
||||||
ScrollPanel@SERVER_LIST:
|
ScrollPanel@SERVER_LIST:
|
||||||
X:15
|
X:15
|
||||||
Y:30
|
Y:280
|
||||||
Width:510
|
Width:700
|
||||||
Height:450
|
Height:300
|
||||||
Children:
|
Children:
|
||||||
ScrollItem@SERVER_TEMPLATE:
|
ScrollItem@SERVER_TEMPLATE:
|
||||||
Width:PARENT_RIGHT-27
|
Width:PARENT_RIGHT-27
|
||||||
@@ -76,7 +80,7 @@ Container@SERVERBROWSER_PANEL:
|
|||||||
Height:25
|
Height:25
|
||||||
Label@PROGRESS_LABEL:
|
Label@PROGRESS_LABEL:
|
||||||
X:(PARENT_RIGHT - WIDTH) / 2
|
X:(PARENT_RIGHT - WIDTH) / 2
|
||||||
Y:PARENT_BOTTOM / 2 - HEIGHT
|
Y:PARENT_BOTTOM / 2 - HEIGHT + (280 / 2)
|
||||||
Width:710
|
Width:710
|
||||||
Height:25
|
Height:25
|
||||||
Font:Bold
|
Font:Bold
|
||||||
@@ -85,20 +89,20 @@ Container@SERVERBROWSER_PANEL:
|
|||||||
Button@BACK_BUTTON:
|
Button@BACK_BUTTON:
|
||||||
Key:escape
|
Key:escape
|
||||||
X:0
|
X:0
|
||||||
Y:499
|
Y:614
|
||||||
Width:140
|
Width:140
|
||||||
Height:35
|
Height:35
|
||||||
Text:Back
|
Text:Back
|
||||||
Button@REFRESH_BUTTON:
|
Button@REFRESH_BUTTON:
|
||||||
X:250
|
X:PARENT_RIGHT - 140 - 10 - 140
|
||||||
Y:499
|
Y:614
|
||||||
Width:140
|
Width:140
|
||||||
Height:35
|
Height:35
|
||||||
Text:Refresh
|
Text:Refresh
|
||||||
Button@JOIN_BUTTON:
|
Button@JOIN_BUTTON:
|
||||||
Key:return
|
Key:return
|
||||||
X:400
|
X:PARENT_RIGHT - 140
|
||||||
Y:499
|
Y:614
|
||||||
Width:140
|
Width:140
|
||||||
Height:35
|
Height:35
|
||||||
Text:Join
|
Text:Join
|
||||||
@@ -85,6 +85,7 @@ ChromeLayout:
|
|||||||
mods/cnc/chrome/dialogs.yaml
|
mods/cnc/chrome/dialogs.yaml
|
||||||
mods/cnc/chrome/objectives.yaml
|
mods/cnc/chrome/objectives.yaml
|
||||||
mods/cnc/chrome/tooltips.yaml
|
mods/cnc/chrome/tooltips.yaml
|
||||||
|
mods/cnc/chrome/irc.yaml
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/cnc/weapons.yaml
|
mods/cnc/weapons.yaml
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ ChromeLayout:
|
|||||||
mods/d2k/chrome/tooltips.yaml
|
mods/d2k/chrome/tooltips.yaml
|
||||||
mods/d2k/chrome/assetbrowser.yaml
|
mods/d2k/chrome/assetbrowser.yaml
|
||||||
mods/ra/chrome/convertassets.yaml
|
mods/ra/chrome/convertassets.yaml
|
||||||
|
mods/ra/chrome/irc.yaml
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/d2k/weapons.yaml
|
mods/d2k/weapons.yaml
|
||||||
|
|||||||
68
mods/ra/chrome/irc.yaml
Normal file
68
mods/ra/chrome/irc.yaml
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
Container@SERVERBROWSER_IRC:
|
||||||
|
Logic:IrcLogic
|
||||||
|
Width:700
|
||||||
|
Height:250
|
||||||
|
Children:
|
||||||
|
Container@IRC_CONTAINER:
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Children:
|
||||||
|
ScrollPanel@HISTORY_PANEL:
|
||||||
|
Width:565
|
||||||
|
Height:PARENT_BOTTOM - 30
|
||||||
|
ItemSpacing:5
|
||||||
|
Label@HISTORY_TEMPLATE:
|
||||||
|
X:5
|
||||||
|
Width:530
|
||||||
|
Height:25
|
||||||
|
WordWrap:True
|
||||||
|
TextField@INPUT_BOX:
|
||||||
|
Y:PARENT_BOTTOM - 25
|
||||||
|
Width:565
|
||||||
|
Height:25
|
||||||
|
ScrollPanel@NICKNAME_PANEL:
|
||||||
|
X:570
|
||||||
|
Width:130
|
||||||
|
Height:PARENT_BOTTOM - 30
|
||||||
|
Label@NICKNAME_TEMPLATE:
|
||||||
|
X:5
|
||||||
|
Button@DISCONNECT_BUTTON:
|
||||||
|
X:570
|
||||||
|
Y:PARENT_BOTTOM - 25
|
||||||
|
Width:130
|
||||||
|
Height:25
|
||||||
|
Text:Disconnect
|
||||||
|
Font:Bold
|
||||||
|
Background@IRC_CONNECT_BG:
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Height:PARENT_BOTTOM
|
||||||
|
Background:scrollpanel-bg
|
||||||
|
Children:
|
||||||
|
Label@GLOBAL_CHAT_LABEL:
|
||||||
|
Y:PARENT_BOTTOM / 4
|
||||||
|
Width:PARENT_RIGHT
|
||||||
|
Align:Center
|
||||||
|
Text:Global Chat
|
||||||
|
Font:Bold
|
||||||
|
Label@NICKNAME_LABEL:
|
||||||
|
X:200
|
||||||
|
Y:PARENT_BOTTOM / 4 + 35
|
||||||
|
Text:Nickname:
|
||||||
|
TextField@NICKNAME_BOX:
|
||||||
|
X:270
|
||||||
|
Y:PARENT_BOTTOM / 4 + 25
|
||||||
|
Width:150
|
||||||
|
Height:25
|
||||||
|
Checkbox@CONNECT_AUTOMATICALLY_CHECKBOX:
|
||||||
|
X:270
|
||||||
|
Y:PARENT_BOTTOM / 4 + 75
|
||||||
|
Height:20
|
||||||
|
Width:180
|
||||||
|
Text:Connect Automatically
|
||||||
|
Button@CONNECT_BUTTON:
|
||||||
|
X:430
|
||||||
|
Y:PARENT_BOTTOM / 4 + 25
|
||||||
|
Width:100
|
||||||
|
Height:25
|
||||||
|
Text:Connect
|
||||||
|
Font:Bold
|
||||||
@@ -2,8 +2,8 @@ Background@JOINSERVER_BG:
|
|||||||
Logic:ServerBrowserLogic
|
Logic:ServerBrowserLogic
|
||||||
X:(WINDOW_RIGHT - WIDTH)/2
|
X:(WINDOW_RIGHT - WIDTH)/2
|
||||||
Y:(WINDOW_BOTTOM - HEIGHT)/2
|
Y:(WINDOW_BOTTOM - HEIGHT)/2
|
||||||
Width:540
|
Width:740
|
||||||
Height:505
|
Height:700
|
||||||
Children:
|
Children:
|
||||||
Label@JOINSERVER_LABEL_TITLE:
|
Label@JOINSERVER_LABEL_TITLE:
|
||||||
X:0
|
X:0
|
||||||
@@ -47,8 +47,8 @@ Background@JOINSERVER_BG:
|
|||||||
ScrollPanel@SERVER_LIST:
|
ScrollPanel@SERVER_LIST:
|
||||||
X:20
|
X:20
|
||||||
Y:80
|
Y:80
|
||||||
Width:500
|
Width:700
|
||||||
Height:355
|
Height:305
|
||||||
Children:
|
Children:
|
||||||
ScrollItem@SERVER_TEMPLATE:
|
ScrollItem@SERVER_TEMPLATE:
|
||||||
Width:PARENT_RIGHT-27
|
Width:PARENT_RIGHT-27
|
||||||
@@ -103,34 +103,37 @@ Background@JOINSERVER_BG:
|
|||||||
Height:25
|
Height:25
|
||||||
Label@PROGRESS_LABEL:
|
Label@PROGRESS_LABEL:
|
||||||
X:(PARENT_RIGHT - WIDTH) / 2
|
X:(PARENT_RIGHT - WIDTH) / 2
|
||||||
Y:PARENT_BOTTOM / 2 - HEIGHT
|
Y:505 / 2 - HEIGHT
|
||||||
Width:150
|
Width:150
|
||||||
Height:30
|
Height:30
|
||||||
Text:Fetching games...
|
Text:Fetching games...
|
||||||
Align:Center
|
Align:Center
|
||||||
Button@REFRESH_BUTTON:
|
Button@REFRESH_BUTTON:
|
||||||
X:20
|
X:20
|
||||||
Y:PARENT_BOTTOM - 45
|
Y:395
|
||||||
Width:100
|
Width:100
|
||||||
Height:25
|
Height:25
|
||||||
Text:Refresh
|
Text:Refresh
|
||||||
Font:Bold
|
Font:Bold
|
||||||
Button@JOIN_BUTTON:
|
Button@JOIN_BUTTON:
|
||||||
X:PARENT_RIGHT - 140 - 130
|
X:PARENT_RIGHT - 120 - 120
|
||||||
Y:PARENT_BOTTOM - 45
|
Y:395
|
||||||
Width:100
|
Width:100
|
||||||
Height:25
|
Height:25
|
||||||
Text:Join
|
Text:Join
|
||||||
Font:Bold
|
Font:Bold
|
||||||
Key:return
|
Key:return
|
||||||
Button@BACK_BUTTON:
|
Button@BACK_BUTTON:
|
||||||
X:PARENT_RIGHT - 140
|
X:PARENT_RIGHT - 120
|
||||||
Y:PARENT_BOTTOM - 45
|
Y:395
|
||||||
Width:100
|
Width:100
|
||||||
Height:25
|
Height:25
|
||||||
Text:Cancel
|
Text:Cancel
|
||||||
Font:Bold
|
Font:Bold
|
||||||
Key:escape
|
Key:escape
|
||||||
|
Container@IRC_ROOT:
|
||||||
|
X:20
|
||||||
|
Y:430
|
||||||
Background@DIRECTCONNECT_BG:
|
Background@DIRECTCONNECT_BG:
|
||||||
Logic:DirectConnectLogic
|
Logic:DirectConnectLogic
|
||||||
X:(WINDOW_RIGHT - WIDTH)/2
|
X:(WINDOW_RIGHT - WIDTH)/2
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ ChromeLayout:
|
|||||||
mods/ra/chrome/tooltips.yaml
|
mods/ra/chrome/tooltips.yaml
|
||||||
mods/ra/chrome/assetbrowser.yaml
|
mods/ra/chrome/assetbrowser.yaml
|
||||||
mods/ra/chrome/convertassets.yaml
|
mods/ra/chrome/convertassets.yaml
|
||||||
|
mods/ra/chrome/irc.yaml
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/ra/weapons.yaml
|
mods/ra/weapons.yaml
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ ChromeLayout:
|
|||||||
mods/ra/chrome/tooltips.yaml
|
mods/ra/chrome/tooltips.yaml
|
||||||
mods/ra/chrome/assetbrowser.yaml
|
mods/ra/chrome/assetbrowser.yaml
|
||||||
mods/ra/chrome/convertassets.yaml
|
mods/ra/chrome/convertassets.yaml
|
||||||
|
mods/ra/chrome/irc.yaml
|
||||||
|
|
||||||
Weapons:
|
Weapons:
|
||||||
mods/ts/weapons.yaml
|
mods/ts/weapons.yaml
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ markdown DOCUMENTATION.md > DOCUMENTATION.html
|
|||||||
# Note that the Tao dlls are shipped on all platforms except osx and that
|
# Note that the Tao dlls are shipped on all platforms except osx and that
|
||||||
# they are now installed to the game directory instead of placed in the gac
|
# they are now installed to the game directory instead of placed in the gac
|
||||||
FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' \
|
FILES=('OpenRA.Game.exe' 'OpenRA.Editor.exe' 'OpenRA.Utility.exe' \
|
||||||
'OpenRA.FileFormats.dll' 'OpenRA.Renderer.SdlCommon.dll' 'OpenRA.Renderer.Cg.dll' 'OpenRA.Renderer.Gl.dll' 'OpenRA.Renderer.Null.dll' \
|
'OpenRA.FileFormats.dll' 'OpenRA.Renderer.SdlCommon.dll' 'OpenRA.Renderer.Cg.dll' 'OpenRA.Renderer.Gl.dll' 'OpenRA.Renderer.Null.dll' 'OpenRA.Irc.dll' \
|
||||||
'FreeSans.ttf' 'FreeSansBold.ttf' 'titles.ttf' 'Dune2k.ttf' \
|
'FreeSans.ttf' 'FreeSansBold.ttf' 'titles.ttf' 'Dune2k.ttf' \
|
||||||
'cg' 'glsl' 'mods/ra' 'mods/cnc' 'mods/d2k' \
|
'cg' 'glsl' 'mods/ra' 'mods/cnc' 'mods/d2k' \
|
||||||
'AUTHORS' 'COPYING' 'HACKING' 'INSTALL' 'CHANGELOG' \
|
'AUTHORS' 'COPYING' 'HACKING' 'INSTALL' 'CHANGELOG' \
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ Section "Client" CLIENT
|
|||||||
File "${SRCDIR}\OpenRA.Renderer.Gl.dll"
|
File "${SRCDIR}\OpenRA.Renderer.Gl.dll"
|
||||||
File "${SRCDIR}\OpenRA.Renderer.Cg.dll"
|
File "${SRCDIR}\OpenRA.Renderer.Cg.dll"
|
||||||
File "${SRCDIR}\OpenRA.Renderer.Null.dll"
|
File "${SRCDIR}\OpenRA.Renderer.Null.dll"
|
||||||
|
File "${SRCDIR}\OpenRA.Irc.dll"
|
||||||
File "${SRCDIR}\ICSharpCode.SharpZipLib.dll"
|
File "${SRCDIR}\ICSharpCode.SharpZipLib.dll"
|
||||||
File "${SRCDIR}\FuzzyLogicLibrary.dll"
|
File "${SRCDIR}\FuzzyLogicLibrary.dll"
|
||||||
File "${SRCDIR}\Mono.Nat.dll"
|
File "${SRCDIR}\Mono.Nat.dll"
|
||||||
@@ -221,6 +222,7 @@ Function ${UN}Clean
|
|||||||
Delete $INSTDIR\OpenRA.Renderer.Cg.dll
|
Delete $INSTDIR\OpenRA.Renderer.Cg.dll
|
||||||
Delete $INSTDIR\OpenRA.Renderer.Null.dll
|
Delete $INSTDIR\OpenRA.Renderer.Null.dll
|
||||||
Delete $INSTDIR\OpenRA.Renderer.SdlCommon.dll
|
Delete $INSTDIR\OpenRA.Renderer.SdlCommon.dll
|
||||||
|
Delete $INSTDIR\OpenRA.Irc.dll
|
||||||
Delete $INSTDIR\ICSharpCode.SharpZipLib.dll
|
Delete $INSTDIR\ICSharpCode.SharpZipLib.dll
|
||||||
Delete $INSTDIR\FuzzyLogicLibrary.dll
|
Delete $INSTDIR\FuzzyLogicLibrary.dll
|
||||||
Delete $INSTDIR\Mono.Nat.dll
|
Delete $INSTDIR\Mono.Nat.dll
|
||||||
|
|||||||
Reference in New Issue
Block a user