mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-08-03 19:28:49 -04:00
Add an option to allow people to join without being invited (requires a public IP address).
Due to the non-obvious technical requirements, I decided to hide it a bit. fixes #618
This commit is contained in:
parent
8aa0e9101b
commit
ca0a37cabb
@ -9,6 +9,7 @@ const gui = @import("../gui.zig");
|
|||||||
const GuiComponent = gui.GuiComponent;
|
const GuiComponent = gui.GuiComponent;
|
||||||
const GuiWindow = gui.GuiWindow;
|
const GuiWindow = gui.GuiWindow;
|
||||||
const Button = @import("../components/Button.zig");
|
const Button = @import("../components/Button.zig");
|
||||||
|
const CheckBox = @import("../components/CheckBox.zig");
|
||||||
const Label = @import("../components/Label.zig");
|
const Label = @import("../components/Label.zig");
|
||||||
const TextInput = @import("../components/TextInput.zig");
|
const TextInput = @import("../components/TextInput.zig");
|
||||||
const VerticalList = @import("../components/VerticalList.zig");
|
const VerticalList = @import("../components/VerticalList.zig");
|
||||||
@ -59,8 +60,22 @@ fn copyIp(_: usize) void {
|
|||||||
main.Window.setClipboardString(ipAddress);
|
main.Window.setClipboardString(ipAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn inviteFromExternal(address: main.network.Address) void {
|
||||||
|
const ip = std.fmt.allocPrint(main.stackAllocator.allocator, "{}", .{address}) catch unreachable;
|
||||||
|
defer main.stackAllocator.free(ip);
|
||||||
|
const user = main.server.User.initAndIncreaseRefCount(main.server.connectionManager, ip) catch |err| {
|
||||||
|
std.log.err("Cannot connect user from external IP {}: {s}", .{address, @errorName(err)});
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
user.decreaseRefCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn makePublic(public: bool) void {
|
||||||
|
main.server.connectionManager.newConnectionCallback.store(if(public) &inviteFromExternal else null, .monotonic);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn onOpen() void {
|
pub fn onOpen() void {
|
||||||
const list = VerticalList.init(.{padding, 16 + padding}, 300, 16);
|
const list = VerticalList.init(.{padding, 16 + padding}, 260, 16);
|
||||||
list.add(Label.init(.{0, 0}, width, "Please send your IP to the player who wants to join and enter their IP below.", .center));
|
list.add(Label.init(.{0, 0}, width, "Please send your IP to the player who wants to join and enter their IP below.", .center));
|
||||||
// 255.255.255.255:?65536 (longest possible ip address)
|
// 255.255.255.255:?65536 (longest possible ip address)
|
||||||
ipAddressLabel = Label.init(.{0, 0}, width, " ", .center);
|
ipAddressLabel = Label.init(.{0, 0}, width, " ", .center);
|
||||||
@ -70,6 +85,7 @@ pub fn onOpen() void {
|
|||||||
list.add(ipAddressEntry);
|
list.add(ipAddressEntry);
|
||||||
list.add(Button.initText(.{0, 0}, 100, "Invite", .{.callback = &invite}));
|
list.add(Button.initText(.{0, 0}, 100, "Invite", .{.callback = &invite}));
|
||||||
list.add(Button.initText(.{0, 0}, 100, "Manage Players", gui.openWindowCallback("manage_players")));
|
list.add(Button.initText(.{0, 0}, 100, "Manage Players", gui.openWindowCallback("manage_players")));
|
||||||
|
list.add(CheckBox.init(.{0, 0}, width, "Allow anyone to join (requires a publicly visible IP address+port which may need some configuration in your router)", main.server.connectionManager.newConnectionCallback.load(.monotonic) != null, &makePublic));
|
||||||
list.finish(.center);
|
list.finish(.center);
|
||||||
window.rootComponent = list.toComponent();
|
window.rootComponent = list.toComponent();
|
||||||
window.contentSize = window.rootComponent.?.pos() + window.rootComponent.?.size() + @as(Vec2f, @splat(padding));
|
window.contentSize = window.rootComponent.?.pos() + window.rootComponent.?.size() + @as(Vec2f, @splat(padding));
|
||||||
|
@ -126,7 +126,7 @@ pub fn init() void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Address = struct {
|
pub const Address = struct {
|
||||||
ip: u32,
|
ip: u32,
|
||||||
port: u16,
|
port: u16,
|
||||||
isSymmetricNAT: bool = false,
|
isSymmetricNAT: bool = false,
|
||||||
@ -368,6 +368,7 @@ pub const ConnectionManager = struct { // MARK: ConnectionManager
|
|||||||
|
|
||||||
mutex: std.Thread.Mutex = .{},
|
mutex: std.Thread.Mutex = .{},
|
||||||
waitingToFinishReceive: std.Thread.Condition = std.Thread.Condition{},
|
waitingToFinishReceive: std.Thread.Condition = std.Thread.Condition{},
|
||||||
|
newConnectionCallback: Atomic(?*const fn(Address) void) = .init(null),
|
||||||
|
|
||||||
receiveBuffer: [Connection.maxPacketSize]u8 = undefined,
|
receiveBuffer: [Connection.maxPacketSize]u8 = undefined,
|
||||||
|
|
||||||
@ -533,19 +534,25 @@ pub const ConnectionManager = struct { // MARK: ConnectionManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defer self.mutex.unlock();
|
{
|
||||||
// Check if it's part of an active request:
|
defer self.mutex.unlock();
|
||||||
for(self.requests.items) |request| {
|
// Check if it's part of an active request:
|
||||||
if(request.address.ip == source.ip and request.address.port == source.port) {
|
for(self.requests.items) |request| {
|
||||||
request.data = main.globalAllocator.dupe(u8, data);
|
if(request.address.ip == source.ip and request.address.port == source.port) {
|
||||||
request.requestNotifier.signal();
|
request.data = main.globalAllocator.dupe(u8, data);
|
||||||
return;
|
request.requestNotifier.signal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if(self.online.load(.acquire) and source.ip == self.externalAddress.ip and source.port == self.externalAddress.port) return;
|
||||||
|
}
|
||||||
|
if(self.newConnectionCallback.load(.monotonic)) |callback| {
|
||||||
|
callback(source);
|
||||||
|
} else {
|
||||||
|
// TODO: Reduce the number of false alarms in the short period after a disconnect.
|
||||||
|
std.log.warn("Unknown connection from address: {}", .{source});
|
||||||
|
std.log.debug("Message: {any}", .{data});
|
||||||
}
|
}
|
||||||
if(self.online.load(.acquire) and source.ip == self.externalAddress.ip and source.port == self.externalAddress.port) return;
|
|
||||||
// TODO: Reduce the number of false alarms in the short period after a disconnect.
|
|
||||||
std.log.warn("Unknown connection from address: {}", .{source});
|
|
||||||
std.log.debug("Message: {any}", .{data});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(self: *ConnectionManager) void {
|
pub fn run(self: *ConnectionManager) void {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user