All Activity
This stream auto-updates
- Past hour
-
should be simple: is computer on home network?
FredS replied to bobD's topic in Network, Cloud and Web
..and if your hotel runs an internal network? -
should be simple: is computer on home network?
bobD replied to bobD's topic in Network, Cloud and Web
Program is a client/server design can that use either a tcp-ip connection to my home network database, or a local connection to an onboard copy. It should default to network if at home, and default to local if I'm on the road. It can also do things like demand additional authorization, etc. Here's what I've come up with so far: (actually, modified from code I found that you posted some 17 years ago); This isn't as clean as I'd like: rather than throwing away any non-local hits, I'd like a a call to something like gethostbyname that would only check the local 192.168~ address space. Haven't found a way to do that. Currently failure takes longer than success (though not as long as attempting to connect to an IB server that isn't there). unit NetworkPeerAvailable; interface uses winapi.windows, winapi.winsock, System.StrUtils; function PeerAvailable(const aTgtName : string) : boolean; implementation const internalIPMarker = '192.168.'; function PeerAvailable(const aTgtName : string) : boolean; type TaPInAddr = array[0..255] of PInAddr; PaPInAddr = ^TaPInAddr; var WSVersion : Word; WSAData: TWSAData; targetHost: PHostEnt; addr: PaPInAddr; UrlStr : string; begin Result := False; WSVersion := MAKEWORD(2, 2); if WSAStartUp(WSVersion, WSAData) = 0 then try targetHost := gethostbyname(PAnsiChar(AnsiString(aTgtName))); if Assigned(targetHost) then begin addr := PaPInAddr(targetHost^.h_addr_list); if Assigned(addr^[0]) then begin UrlStr := string(inet_ntoa(addr^[0]^)); if StartsText(internalIPMarker, UrlStr) then Result := True; end; end; finally WSACleanUp; end; end; - Today
-
"give it a fixed ip address outside the dhcp range" Unfortunately for this issue, I live in a building where the unit routers are provided as pretty much closed systems. Just about the only thing I have access to is setting the wifi password.
-
open mail online with office 365 graph api
Olli73 replied to mazluta's topic in RTL and Delphi Object Pascal
Have you also provided values for "providerType", "isFolder", ...? See my JSON above. -
Run as admin on unauthorized Windows username
FredS replied to Mustafa E. Korkmaz's topic in Windows API
The User token must exist else you cannot enable it. Also Impersonations work on a thread basis, it may not be possible to use the Main Thread for this! It may be worth your while to supply us with Process Explorer details as Kas has. -
Run as admin on unauthorized Windows username
Mustafa E. Korkmaz replied to Mustafa E. Korkmaz's topic in Windows API
The Elevate package is mentioned in the link Remy sent. The program is run normally under a non-admin user name. As far as I know If the program is not run with admin rights, we cannot use the AdjustTokenPrivileges function for SE_ASSIGN_PRIMARY_TOKEN_NAME. -
Run as admin on unauthorized Windows username
Kas Ob. replied to Mustafa E. Korkmaz's topic in Windows API
Not sure what are you talking about ?! Elevate package and zip file ! You don't need to rerun your process with higher (elevated) privileges, you can elevate or lets say enable a specific privilege for the current process (or token in general, which is most the time is a handle) by using AdjustTokenPrivileges https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-adjusttokenprivileges You can use something like this function EnablePrivilege(const PrivilegeName: string): Boolean; var TokenHandle: THandle; NewState: TOKEN_PRIVILEGES; ReturnLength: DWORD; begin Result := False; if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then try NewState.PrivilegeCount := 1; NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; if LookupPrivilegeValue(nil, PChar(PrivilegeName), NewState.Privileges[0].Luid) then begin if AdjustTokenPrivileges(TokenHandle, False, NewState, SizeOf(NewState), nil, ReturnLength) then Result := GetLastError <> ERROR_NOT_ALL_ASSIGNED; end; finally CloseHandle(TokenHandle); end; end; .. const SE_ASSIGN_PRIMARY_TOKEN_NAME = 'SeAssignPrimaryTokenPrivilege'; .. // call it with something like this if EnablePrivilege(SE_ASSIGN_PRIMARY_TOKEN_NAME) then begin .. Just remember to check for elevated process before calling as it will fail, in other words if you are not administrator will not be able to enable SeAssignPrimaryTokenPrivilege hence your process will most likely will be able to run remove process with login etc.. If your account doesn't have TOKEN_ADJUST_PRIVILEGES enabled which is enabled for Administrator ... users then you can't adjust for the current process. Also i said i am not sure if this will solve your problem in full or it will be enough, as there is different causes might prevent such execution, also there is policies should be enabled allowing the such run for a remote process. in all cases run your application or test one, then use Process Explorer, you can see in the Security tab for that application like this screenshot I put a break point using the debugger and confirmed that the SeAssignPrimaryTokenPrivilege privilege is enabled or elevated for this particular privilege, one thing though Process explorer tab need to be closed and reopened to refresh these information. -
open mail online with office 365 graph api
mazluta replied to mazluta's topic in RTL and Delphi Object Pascal
thanks for you replay. this is not the solution. just to be clear. if i send the POST without the Attachment, the mail online is open. the problem is in the attachment array. i tried to send full path (from onedrive upload), fileID, linkID, webURL.... dont no what to try more. chatGPT and Gimini are looping over and over... the Microsoft stuff send you to articles that send you to more articles... -
Priya sharma joined the community
-
wuppdi Welcome Page for Delphi 11 Alexandria?
gkobler replied to PeterPanettone's topic in Delphi IDE and APIs
I‘m working on that, to resolve that dependence. But it takes some time, i‘m still busy with other task. At the moment you have to install VirtuallTreeview or stay on B33. -
Run as admin on unauthorized Windows username
Mustafa E. Korkmaz replied to Mustafa E. Korkmaz's topic in Windows API
Thanks for all the advice. I couldn't find anything about The Elevate package (Elevate_BinariesAndDocs.zip) I couldn't find it but even if I found these, users do not want Elevate.dll and Elevate.exe to run separately outside the normal application. The interesting thing is that the Anydesk application can do this with a single exe, without requiring installation or making any settings on the computer. At first glance it doesn't seem like a difficult subject. -
wuppdi Welcome Page for Delphi 11 Alexandria?
KenR replied to PeterPanettone's topic in Delphi IDE and APIs
I don't want to install VirtualTree. Does that mean I have to stay on B33? -
This is my free application https://limelect.com/downloads/youtube_downloader_shell/ That is a shell for youtube-dl proven application
- 11 replies
-
- delphi xe7
- youtube
-
(and 1 more)
Tagged with:
-
open mail online with office 365 graph api
Olli73 replied to mazluta's topic in RTL and Delphi Object Pascal
I have no experience with Microsoft API, but that looks to me that you do not need to create a sharelink first, instead you can directly enter the file or folder as sourceUrl: { "post": { "body": { "contentType": "text", "content": "I attached a reference to a file on OneDrive." }, "attachments": [{ "@odata.type": "#microsoft.graph.referenceAttachment", "name": "Personal pictures", "sourceUrl": "https://contoso.com/personal/mario_contoso_net/Documents/Pics", "providerType": "oneDriveConsumer", "permission": "Edit", "isFolder": "True" } ] } } -
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
This check will trigger on all networks, which are set to private which is probably not a desired behavior. While these will work, OP's solution will be a different design pattern. What if you put the code in a separate DLL, which you are not distributing; and lives only on your home dev PC? -
ScroogeXHTML for Object Pascal 9.2.1 - fast RTF to HTML5 conversion
limelect replied to mjustin's topic in Delphi Third-Party
That's not important as the application you give can be done with TMS-rich with one line of code!!! So good luck -
Well that may be, but I have seen this in other documents from Embarcadero and it is in the blog for the release. So someone thought it was going to happen. https://blogs.embarcadero.com/announcing-the-availability-of-rad-studio-12-3-athens/#Quality_for_BLE_and_Bluetooth But thanks for the info. This was not a must have for me, but it might have been a nice to have.
-
should be simple: is computer on home network?
Brian Evans replied to bobD's topic in Network, Cloud and Web
There are network profiles in Windows which can be Private, Public or Domain. Normally your home network would be Private and anytime you go elsewhere it would be Public (discovery disabled) or Domain. You could check what the active connection is. Or just key off the active profile name for what network settings your application should use. Snippet below for PowerShell. Get-WmiObject MSFT_NetConnectionProfile -Namespace root/StandardCimv2 | select Name,@{n='ActiveNetworkProfile';e={ switch ($_.NetworkCategory){ 0 {'Public'} 1 {'Private'} 2 {'Domain'} Default {$_.NetworkCategory} } } } - Yesterday
-
Is there anyone that tried to open mail online with attachment? 1. get AccessToken from Graph API with clientID, ApplicationID +++ (that work) 2. upload file to onedrive. (that work) 3. get sharelink. (that work) 4. open /me/message (that FAIL) 5. the subject will be empty, the body empty. 6. the user can add more files. 7. the user can add recipients, subject, body..... 8. click on send. i have mange to get the AccessToken. Upload the file to ondrive/temp folder get the sharelink but i can not draft the message. CHATGPT - professional - did not help. GIMINI - Advance - the same MICROSOFT - like to make living harder this is the log ============ CreateSharingLink - Response Status Code: 200 CreateSharingLink - Response Body: {"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.permission","id":"6977e500-5d45-47cc-82e8-d6ea3ceeef8d","roles":["read"],"shareId":"u!aHR0cHM6Ly9oYW5pYmFhbGNvaWwtbXkuc2hhcmVwb2ludC5jb20vOmI6L2cvcGVyc29uYWwvbWF6bHV0YV9oYW5pYmFhbF9jb19pbC9FVS1BSU1VOTU1UkJsX0RveDhrUlBUUUJGZDBXNmlOcVY3bEljQlVYcTMwME5R","hasPassword":false,"link":{"scope":"organization","type":"view","webUrl":"https://hanibaalcoil-my.sharepoint.com/:b:/g/personal/mazluta_hanibaal_co_il/EU-AIMU955RBl_Dox8kRPTQBFd0W6iNqV7lIcBUXq300NQ","preventsDownload":false}} CreateSharingLink - HTTP Protocol version Version: 2 CreateSharingLink - Result.webUrl = https://hanibaalcoil-my.sharepoint.com/:b:/g/personal/mazluta_hanibaal_co_il/EU-AIMU955RBl_Dox8kRPTQBFd0W6iNqV7lIcBUXq300NQ CreateSharingLink - Result.shareId = u!aHR0cHM6Ly9oYW5pYmFhbGNvaWwtbXkuc2hhcmVwb2ludC5jb20vOmI6L2cvcGVyc29uYWwvbWF6bHV0YV9oYW5pYmFhbF9jb19pbC9FVS1BSU1VOTU1UkJsX0RveDhrUlBUUUJGZDBXNmlOcVY3bEljQlVYcTMwME5R UploadAndOpenMailWithAttachment - Share URL created: https://hanibaalcoil-my.sharepoint.com/:b:/g/personal/mazluta_hanibaal_co_il/EU-AIMU955RBl_Dox8kRPTQBFd0W6iNqV7lIcBUXq300NQ UploadAndOpenMailWithAttachment - Share ID: u!aHR0cHM6Ly9oYW5pYmFhbGNvaWwtbXkuc2hhcmVwb2ludC5jb20vOmI6L2cvcGVyc29uYWwvbWF6bHV0YV9oYW5pYmFhbF9jb19pbC9FVS1BSU1VOTU1UkJsX0RveDhrUlBUUUJGZDBXNmlOcVY3bEljQlVYcTMwME5R UploadAndOpenMailWithAttachment - JSON Request: { "subject": "Document from DMS", "body": { "contentType": "HTML", "content": "Please review the attached file." }, "attachments": [ { "@odata.type": "#microsoft.graph.referenceAttachment", "name": "GettingStarted.pdf", "sourceUrl": "https://graph.microsoft.com/v1.0/shares/u!aHR0cHM6Ly9oYW5pYmFhbGNvaWwtbXkuc2hhcmVwb2ludC5jb20vOmI6L2cvcGVyc29uYWwvbWF6bHV0YV9oYW5pYmFhbF9jb19pbC9FVS1BSU1VOTU1UkJsX0RveDhrUlBUUUJGZDBXNmlOcVY3bEljQlVYcTMwME5R/root/content", "isInline": false } ]} UploadAndOpenMailWithAttachment - Create Draft Response Code: 400 UploadAndOpenMailWithAttachment - Create Draft Response Body: {"error":{"code":"UnableToDeserializePostBody","message":"were unable to deserialize "}} UploadAndOpenMailWithAttachment - Error creating draft. UploadAndOpenMailWithAttachment - Finished the main procedure : ============ procedure TMainForm.UploadAndOpenMailWithAttachment(const LocalFilePath: string); var HttpClient: THttpClient; OneDriveWebURL: string; AttachFileId: string; SharingLinkRec: TSharingLinkRec; DraftId: string; JSONRequestDraft: string; DraftResponse: IHTTPResponse; Headers: TNetHeaders; RequestContent: TStringStream; begin AppLog.Lines.Add(''); AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Starting'); HttpClient := THttpClient.Create; try if UploadFileToOneDrive(LocalFilePath, OneDriveWebURL, AttachFileId) then begin AppLog.Lines.Add('UploadAndOpenMailWithAttachment - File uploaded to OneDrive'); SharingLinkRec := CreateSharingLink(AttachFileId); if SharingLinkRec.Found then begin AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Share URL created: ' + SharingLinkRec.webUrl); AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Share ID: ' + SharingLinkRec.shareId); JSONRequestDraft := '{' + ' "subject": "Document from DMS",' + ' "body": {' + ' "contentType": "HTML",' + ' "content": "Please review the attached file."' + ' },' + ' "attachments": [' + ' {' + ' "@odata.type": "#microsoft.graph.referenceAttachment",' + //' "name": "' + JsonEscape(j_FileName(LocalFilePath)) + '",' + ' "name": "' + j_FileName(LocalFilePath) + '",' + ' "sourceUrl": "https://graph.microsoft.com/v1.0/shares/' + SharingLinkRec.shareId + '/root/content",' + // **Corrected sourceUrl** ' "isInline": false' + ' }' + ' ]' + '}'; AppLog.Lines.Add('UploadAndOpenMailWithAttachment - JSON Request: ' + JSONRequestDraft); SetLength(Headers, 2); Headers[0].Name := 'Authorization'; Headers[0].Value := 'Bearer ' + FAccessToken; Headers[1].Name := 'Content-Type'; Headers[1].Value := 'application/json'; RequestContent := TStringStream.Create(JSONRequestDraft, TEncoding.UTF8); try DraftResponse := HttpClient.Post('https://graph.microsoft.com/v1.0/me/messages', RequestContent, nil, Headers); AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Create Draft Response Code: ' + IntToStr(DraftResponse.StatusCode)); AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Create Draft Response Body: ' + DraftResponse.ContentAsString); if (DraftResponse.StatusCode = 200) or (DraftResponse.StatusCode = 201) then begin // Extract the draft ID (you already have this function) DraftId := ExtractDraftIdFromResponse(DraftResponse.ContentAsString); AppLog.Lines.Add('UploadAndOpenMailWithAttachment - DraftId: ' + DraftId); // Open the draft in Outlook UniSession.AddJS(Format('window.open("https://outlook.office.com/mail/deeplink/compose?itemid=%s&exvsurl=1", "_blank");', [DraftId])); end else begin AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Error creating draft.'); end; finally RequestContent.Free; end; end else begin AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Failed to create shareable link.'); end; end else begin AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Error uploading file to OneDrive.'); end; finally HttpClient.Free; end; AppLog.Lines.Add('UploadAndOpenMailWithAttachment - Finished'); AppLog.Lines.Add(''); end; this is the upload ============ function TMainForm.UploadFileToOneDrive(const LocalFilePath: string; out OneDriveWebURL : string; out AttachFileId : string) : Boolean; var HttpClient: THttpClient; FileStream: TFileStream; FileSize: Int64; UploadURL: string; Response: IHTTPResponse; Headers: TNetHeaders; OneDriveItemJSON: TJSONObject; Success: Boolean; begin Success := False; Result := False; AppLog.Lines.Add(''); AppLog.Lines.Add(''); OneDriveWebURL := ''; AttachFileId := ''; Try HttpClient := THttpClient.Create; try FileStream := TFileStream.Create(LocalFilePath, fmOpenRead or fmShareDenyNone); try FileSize := FileStream.Size; UploadURL := 'https://graph.microsoft.com/v1.0/me/drive/root:/Temp/' + ExtractFileName(LocalFilePath) + ':/content'; SetLength(Headers, 2); Headers[0].Name := 'Authorization'; Headers[0].Value := 'Bearer ' + FAccessToken; Headers[1].Name := 'Content-Type'; Headers[1].Value := 'application/octet-stream'; // Adjust if needed Response := HttpClient.Put(UploadURL, FileStream, nil, Headers); AppLog.Lines.Add('ResponseCode (Upload) := ' + IntToStr(Response.StatusCode)); AppLog.Lines.Add('ResponseBody (Upload) := ' + Response.ContentAsString); if (Response.StatusCode = 200) or (Response.StatusCode = 201) then begin OneDriveItemJSON := TJSONObject.ParseJSONValue(Response.ContentAsString) as TJSONObject; try if Assigned(OneDriveItemJSON) then begin OneDriveWebURL := OneDriveItemJSON.GetValue('webUrl').Value; AttachFileId := OneDriveItemJSON.GetValue('id').Value; AppLog.Lines.Add(''); AppLog.Lines.Add('OneDrive Web URL: ' + OneDriveWebURL); AppLog.Lines.Add(''); Success := True; end; finally OneDriveItemJSON.Free; end; end else begin AppLog.Lines.Add('Error uploading file to OneDrive. Status Code: ' + IntToStr(Response.StatusCode)); // Optionally log the full error response end; finally FileStream.Free; end; finally HttpClient.Free; end; Result := Success; AppLog.Lines.Add(''); AppLog.Lines.Add(''); Except; Result := False; End; end; this is the createShareLink Proc ==================== function TMainForm.CreateSharingLink(const FileId: string): TSharingLinkRec; var HttpClient: THttpClient; Payload: TStringStream; Response: IHTTPResponse; JsonObj: TJSONObject; begin Result.webUrl := ''; Result.shareId := ''; Result.Found := False; HttpClient := THttpClient.Create; try HttpClient.CustomHeaders['Authorization'] := 'Bearer ' + FAccessToken; HttpClient.ContentType := 'application/json'; AppLog.Lines.Add(''); AppLog.Lines.Add('HttpClient.CustomHeaders[Authorization] : ' + HttpClient.CustomHeaders['Authorization'] ); AppLog.Lines.Add('HttpClient.ToString : ' + HttpClient.ToString ); AppLog.Lines.Add(''); Payload := TStringStream.Create('{"type":"view","scope":"organization"}', TEncoding.UTF8); try Response := HttpClient.Post( 'https://graph.microsoft.com/v1.0/me/drive/items/' + FileId + '/createLink', Payload); AppLog.Lines.Add('CreateSharingLink - Response Status Code: ' + IntToStr(Response.StatusCode)); AppLog.Lines.Add('CreateSharingLink - Response Body: ' + Response.ContentAsString); AppLog.Lines.Add('CreateSharingLink - HTTP Protocol version Version: ' + VarToStr(Response.Version)); if (Response.StatusCode = 200) or (Response.StatusCode = 201) then begin JsonObj := TJSONObject.ParseJSONValue(Response.ContentAsString) as TJSONObject; try Result.webUrl := JsonObj.GetValue<TJSONObject>('link').GetValue<string>('webUrl'); Result.shareId := JsonObj.GetValue<string>('shareId'); finally JsonObj.Free; end; end else begin AppLog.Lines.Add('Failed to create sharing link: ' + Response.StatusText); AppLog.Lines.Add('Response Content: ' + Response.ContentAsString); end; finally Payload.Free; end; finally HttpClient.Free; end; AppLog.Lines.Add('CreateSharingLink - Result.webUrl = ' + Result.webUrl); AppLog.Lines.Add('CreateSharingLink - Result.shareId = ' + Result.shareId); Result.Found := (Trim(Result.webUrl) <> '') And (Trim(Result.shareId) <> ''); end;
-
TMemo no longer scrolls on iOS when set to Platform on iOS 18
Dave Nottage replied to Chris Pim's topic in FMX
I've added a comment to the report, however I'm repeating it here: It appears the UIPanGestureRecognizer being used in the parent "native" implementation (TiOSScrollBox) is interfering with the scrolling - I'm yet to find exactly why. Making a copy of FMX.ScrollBox.iOS and commenting out this line: View.addGestureRecognizer(FPanRecognizer); seems to fix it, but I expect any pan gestures supported by Delphi will be lost, and this would also apply to TStringGrid, for example. -
If it's a dedicated db server, give it a fixed ip address outside the dhcp range, and call it with the ip address. I would not use the dns name if there's not an internal dns server on the network.
-
should be simple: is computer on home network?
Remy Lebeau replied to bobD's topic in Network, Cloud and Web
Ask the user. The OS only knows whether there is a network connection or not. It doesn't care where the network is located or what it's connected to. That's up to the hardware to deal with. No. And as far as sockets are concerned, there is no difference whatsoever whether you are connected to a wired LAN, or to a Wifi, or a cellular provider, etc. The socket API works the same way. The difference is in how the hardware routes the traffic. Likely because this is not what that API is intended for. What EXACTLY are you trying to accomplish in the first place? -
should be simple: is computer on home network?
aehimself replied to bobD's topic in Network, Cloud and Web
When you are trying to detect your home network, don't rely on a successful (reverse) DNS lookup. I usually ping my home router (using fqdn) but even better, attempt a connection to a well-known service. However I only use this method to decide if VPN should be fired up or not; it's better to set up your DNS properly so tools will work from inside and outside. If you are keen to go this way I found these two snipplets in my codebase: Function LookupHostName(inIP: String): String; Var host: PHostEnt; addr: Integer; dat: TWSAData; Begin Result := ''; WSAStartup($0101, dat); Try addr := inet_addr(PAnsiChar(AnsiString(inIP))); host := GetHostByAddr(@addr, 4, PF_INET); If host <> nil Then Result := String(host.h_name); Finally WSACleanup; End; End; This one was abandoned halfway as no variables seem to be declared: Write('Attempting to resolve ' + HostName + '...'); If WSAStartup($0101, wsdata) = 0 Then Try tmp := GetHostByName(PAnsiChar(HostName)); If tmp <> nil Then Begin tmpin.sin_addr.S_addr := LongInt(PLongInt(tmp^.h_addr_list^)^); IPAddress := inet_ntoa(tmpin.sin_addr); WriteLn(IPAddress); End; Finally WSACleanup; End; May I ask why your program needs to behave different from a specific network? There might be a better way than relying on simple checks, which might trigger in places you don't want them to. -
itzavanika joined the community
-
Basically, program needs to act differently if at home or away--so how do I know? I've looked at using Winsock and HostEnt := gethostbyaddr(@SocketAddr.sin_addr.S_addr, 4, AF_INET); and although that tells me if my home interbase server is available, in a dynamic DHCP environment that IP address isn't necessarily constant. And a call to addr 192.168.1.1 (home router and default DNS gateway) returns nil: the peer computers respond, but the router doesn't. Is there another way to get the name of the local network LAN that works both wired (desktop machines) and wifi? I'd like to try using winsock's gethostbyname but I haven't found a good use example. Or is there a better way? bobD
-
Check that the network card isn't powering down to save electricity. Windows is starting to set that stuff on it's own after updates. It now "shuts down" the monitor to save power after the screen saver is on after a few minutes, and there's no way to change that on, but a network card put to sleep can be overridden
-
Letting AI Handle the Docs: Experiments with Doxygen Comment Blocks
dummzeuch replied to mjustin's topic in Tips / Blogs / Tutorials / Videos
But we have Vibe Coding now!